Compiler construction 在重定向输出时,保存堆栈指针会导致分段错误
我正在写Sparc编译器。我的一个测试用例正常运行,但当输出重定向到文件时崩溃 使用GDB,我发现这是导致SEGD故障的线路:Compiler construction 在重定向输出时,保存堆栈指针会导致分段错误,compiler-construction,segmentation-fault,sparc,Compiler Construction,Segmentation Fault,Sparc,我正在写Sparc编译器。我的一个测试用例正常运行,但当输出重定向到文件时崩溃 使用GDB,我发现这是导致SEGD故障的线路: save %sp, -800, %sp 我的堆栈空间不足吗?怎么回事?为什么只有重定向输出时才会发生这种情况?SPARC中的save指令只能通过窗口溢出陷阱触发segfault。如果: 堆栈已用完(和/或堆栈指针已损坏) 并导致窗口溢出(即寄存器窗口写回刷新到堆栈) 后者意味着事件的发生具有不可预测性。这是因为溢出的发生取决于以前寄存器窗口的使用情况-溢出的确切发生
save %sp, -800, %sp
我的堆栈空间不足吗?怎么回事?为什么只有重定向输出时才会发生这种情况?SPARC中的
save
指令只能通过窗口溢出陷阱触发segfault。如果:
我可以想象,由于输出重定向,溢出可能性可能会增加(写入到文件端的堆栈比写入到控制台端的堆栈更深,更有可能退出进程的注册胜利)
如果是这种情况,那么即使没有输出重定向,您也应该能够强制测试用例的一致性失败,如果您将后台CPU/堆栈hogger(循环中的200000递归阶乘,以永久性地丢弃注册表窗口)绑定到您的测试用例正在处理的同一个CPU上。您能提供更多详细信息吗?那个测试用例在做什么?可能是堆栈跟踪?