3

illegal operand运行程序时出现错误。发生崩溃的程序是用汇编编写的,并作为目标文件链接,所以我不确定如何使用gdb它。我通过捕获信号注意到了错误。我SIGILL想获取违规指令的地址。我想到的一种方法是在信号处理程序中获取最后一个执行上下文,并从中记下rip寄存器的值。我知道上下文被传递给信号处理程序,但不知道如何。

4

2 回答 2

5

如果您确实想遵循信号处理程序路线,那么获取导致信号处理程序运行的指令的地址并不难。当您创建信号处理程序时,请SA_SIGINFO在标志设置中设置该位。然后,当您编写处理程序时,它将可以访问一个siginfo_t结构,该结构包含si_addr触发异常的内存位置的地址字段。

于 2012-04-28T17:48:48.327 回答
0

用汇编编写并链接为目标文件,所以我不确定如何使用 gdb

GDB 非常适合调试汇编代码。你会想要info registersx/i $pc

我想到的一种方法是在信号处理程序中获取最后一个执行上下文,并从中记下 rip 寄存器的值。

没关系(请参阅加布里埃尔关于如何获取上下文的答案)。

请注意,与您在崩溃点在 GDB 中获得的信息相比,这不会为您提供任何额外的信息。如果您一开始不知道如何使用 GDB,那么我看不到通过在信号处理程序中获取上下文会获得什么。

于 2012-04-28T19:23:24.660 回答