在我的 SPARC 程序集中调试段错误的最佳方法是什么?

Ree*_*rse 3 compiler-construction assembly gdb sparc

我正在编写一个 sparc 编译器。我的一个测试用例在从命令行正常运行时工作正常,但是当我将输出重定向到文件时出现段错误。

我试过使用 GDB,但组装起来很困难。我怎样才能找出像哪条装配线导致段错误这样简单的事情?

Cra*_*rks 5

不幸的是,GDB 确实是在 UnixSPARC 中调试机器级问题的最佳方式,这有点令人难过。

要理解的基本事情是段错误是一种异常,如果附加了异常,则异常会导致程序闯入调试器。他们这样做是为了您可以检查崩溃时处理器寄存器和内存的状态。

您应该查看指令计数器寄存器 (%ip)。这将包含要执行的最后一条指令的地址,即触发段错误的指令。这将是一个加载或存储操作,因此您可以查看哪个寄存器包含其源/目标内存地址,并找出该地址错误的原因(通常它是 NULL,或者一些不是有效地址的垃圾数字)。

您可以做的另一件事是编译您的进程以在它失败时发出核心转储,这将写出程序死时的状态快照,作为磁盘上的一个大文件。不幸的是,用于读取核心转储的程序是... gdb。