重定向输出时,保存堆栈指针会导致分段错误

时间:2010-12-06 09:03:58

标签: compiler-construction segmentation-fault sparc

我正在编写Sparc编译器。我的一个测试用例运行正常,但在输出重定向到文件时崩溃。

使用GDB,我发现这是引起segfault的行:

save  %sp, -800, %sp

我是否在堆栈空间之外?这是怎么回事?为什么只有在重定向输出时才会发生?

1 个答案:

答案 0 :(得分:0)

SPARC中的save指令只能通过窗口溢出陷阱触发段错误。如果出现这种情况:

  1. 你已经用完了堆栈(和/或有一个损坏的堆栈指针)
  2. 导致窗口溢出(即寄存器窗口写回刷新到堆栈)。
  3. 后者意味着在出现时存在不可预测性的因素。这是因为泄漏的发生取决于之前的寄存器窗口使用情况 - 泄漏的确切发生可能会通过分时共享同一CPU的其他进程而发生变化。 Solaris不会自动溢出每个上下文切换上的整个reg窗口集,因为这会影响性能。例如。两个使用八个窗口(堆栈帧)的工作负载可能会互相抢占,并且在具有> = 16 reg窗口的CPU上完全“无堆栈”运行。 我可以想象由于输出重定向导致溢出可能性增加(写入文件中的堆栈比写入控制台更深,更有可能驱逐你的进程'reg wins)。

    如果是这种情况,那么即使没有输出重定向,如果绑定后台CPU /堆栈hogger(递归因子为200000,在循环中,永久删除reg窗口),您应该能够强制执行测试用例的一致性失败)到你的测试用例正在处理的同一个CPU上。