2010-12-06 33 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上。