我正在编写一个 Sparc 编译器。我的一个测试用例运行正常,但是当输出重定向到文件时崩溃。
使用 GDB,我发现这是导致段错误的行:
save %sp, -800, %sp
我的堆栈空间不足了吗?这是怎么回事?为什么它只在我重定向输出时发生?
我正在编写一个 Sparc 编译器。我的一个测试用例运行正常,但是当输出重定向到文件时崩溃。
使用 GDB,我发现这是导致段错误的行:
save %sp, -800, %sp
我的堆栈空间不足了吗?这是怎么回事?为什么它只在我重定向输出时发生?
SPARC 中的save
指令只能通过窗口溢出陷阱触发段错误。如果发生这种情况:
后者意味着发生中存在不可预测的因素。这是因为溢出的发生取决于先前的寄存器窗口使用情况 - 溢出的确切发生可以通过分时共享同一 CPU 的其他进程所做的改变。Solaris 不会在每次上下文切换时自动溢出整个 reg 窗口集,因为这会损害性能。例如,使用 8 个窗口(堆栈帧)的两个工作负载可能会愉快地互相抢占,并在具有 >= 16 个 reg 窗口的 CPU 上完全“无堆栈”运行。
我可以想象,由于输出重定向,溢出的可能性可能会增加(写入文件的堆栈比写入控制台的堆栈更深更有可能驱逐您的进程的注册胜利)。
如果是这种情况,那么即使没有输出重定向,如果您将后台 CPU / stack hogger(递归阶乘为 200000,在循环中永久丢弃 reg 窗口)绑定到您的测试用例正在处理的同一个 CPU。