2010-12-06 78 views
1

我正在編寫一個Sparc編譯器。我的一個測試用例正常運行良好,但輸出重定向到文件時崩潰。當輸出被重定向時,保存堆棧指針會導致段錯誤

使用GDB,我發現,這是導致段錯誤行:

save %sp, -800, %sp 

難道我的堆棧空間?這是怎麼回事?當我重定向輸出時,它是如何發生的?

+0

你會提供更多的細節?那個測試用例在做什麼?堆棧跟蹤可能? – 2010-12-10 13:35:48

回答

0

A save SPARC中的指令只能通過窗口溢出陷阱觸發段錯誤。

  1. 你已經用完棧(和/或已損壞stackpointer)
  2. 導致窗口溢出(即寄存器窗口,寫回沖洗堆棧):如果這會發生。

後者意味着在發生時存在不可預測性的因素。這是因爲溢出的發生取決於之前的註冊窗口使用情況 - 溢出的確切發生可以通過與同一CPU共享的其他進程發生改變。 Solaris不會自動泄漏每個上下文切換的整個註冊窗口集,因爲這會損害性能。例如。兩個使用八個窗口(堆棧框架)的工作負載可能會愉快地相互搶佔,並在具有> = 16個註冊窗口的CPU上完全「無堆棧」運行。
我可以想象,由於輸出重定向(對寫入文件的深層堆棧比寫入到控制檯端更有可能會驅逐您的進程的reg獲勝),溢出可能性可能會增加。

如果是這種情況,那麼即使沒有輸出重定向,如果綁定後臺CPU /堆棧hogger(循環中遞歸階數爲200000,永久垃圾註冊表),您應該能夠強制測試用例一致失敗窗口)放到您的測試用例正在處理的同一CPU上。