我正在编写Sparc编译器。我的一个测试用例运行正常,但在输出重定向到文件时崩溃。
使用GDB,我发现这是引起segfault的行:
save %sp, -800, %sp
我是否在堆栈空间之外?这是怎么回事?为什么只有在重定向输出时才会发生?
答案 0 :(得分:0)
SPARC中的save
指令只能通过窗口溢出陷阱触发段错误。如果出现这种情况:
后者意味着在出现时存在不可预测性的因素。这是因为泄漏的发生取决于之前的寄存器窗口使用情况 - 泄漏的确切发生可能会通过分时共享同一CPU的其他进程而发生变化。 Solaris不会自动溢出每个上下文切换上的整个reg窗口集,因为这会影响性能。例如。两个使用八个窗口(堆栈帧)的工作负载可能会互相抢占,并且在具有> = 16 reg窗口的CPU上完全“无堆栈”运行。 我可以想象由于输出重定向导致溢出可能性增加(写入文件中的堆栈比写入控制台更深,更有可能驱逐你的进程'reg wins)。
如果是这种情况,那么即使没有输出重定向,如果绑定后台CPU /堆栈hogger(递归因子为200000,在循环中,永久删除reg窗口),您应该能够强制执行测试用例的一致性失败)到你的测试用例正在处理的同一个CPU上。