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

Compiler construction 在重定向输出时,保存堆栈指针会导致分段错误,compiler-construction,segmentation-fault,sparc,Compiler Construction,Segmentation Fault,Sparc,我正在写Sparc编译器。我的一个测试用例正常运行,但当输出重定向到文件时崩溃 使用GDB,我发现这是导致SEGD故障的线路: save %sp, -800, %sp 我的堆栈空间不足吗?怎么回事?为什么只有重定向输出时才会发生这种情况?SPARC中的save指令只能通过窗口溢出陷阱触发segfault。如果: 堆栈已用完(和/或堆栈指针已损坏) 并导致窗口溢出(即寄存器窗口写回刷新到堆栈) 后者意味着事件的发生具有不可预测性。这是因为溢出的发生取决于以前寄存器窗口的使用情况-溢出的确切发生

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

使用GDB,我发现这是导致SEGD故障的线路:

save  %sp, -800, %sp

我的堆栈空间不足吗?怎么回事?为什么只有重定向输出时才会发生这种情况?

SPARC中的
save
指令只能通过窗口溢出陷阱触发segfault。如果:

  • 堆栈已用完(和/或堆栈指针已损坏)
  • 并导致窗口溢出(即寄存器窗口写回刷新到堆栈)
  • 后者意味着事件的发生具有不可预测性。这是因为溢出的发生取决于以前寄存器窗口的使用情况-溢出的确切发生情况可以通过分时共享同一CPU的其他进程所做的更改而改变。Solaris不会自动溢出每个上下文开关上设置的整个注册表窗口,因为这会影响性能。例如,使用八个窗口(stackframes)的两个工作负载可能会愉快地相互抢占,并在>=16个注册窗口的CPU上完全“无堆栈”运行。
    我可以想象,由于输出重定向,溢出可能性可能会增加(写入到文件端的堆栈比写入到控制台端的堆栈更深,更有可能退出进程的注册胜利)


    如果是这种情况,那么即使没有输出重定向,您也应该能够强制测试用例的一致性失败,如果您将后台CPU/堆栈hogger(循环中的200000递归阶乘,以永久性地丢弃注册表窗口)绑定到您的测试用例正在处理的同一个CPU上。

    您能提供更多详细信息吗?那个测试用例在做什么?可能是堆栈跟踪?