运行程序时出现illegal operand
错误。发生崩溃的程序是用汇编语言编写的,并作为目标文件链接,因此我不确定如何使用gdb
。我通过捕获SIGILL
信号来注意到这个错误。我想获取有问题的指令的地址。我想到的一种方法是在信号处理程序中获取最后一个执行上下文,并记下rip
寄存器的值。我知道上下文传递给信号处理程序,但不知道如何。
答案 0 :(得分:5)
如果您确实想要遵循信号处理程序路由,那么获取导致信号处理程序运行的指令的地址并不困难。创建信号处理程序时,请在flags设置中设置SA_SIGINFO
位。然后,当您编写处理程序时,它将可以访问包含字段siginfo_t
的{{1}}结构,该字段是触发异常的内存位置的地址。
答案 1 :(得分:0)
用汇编语言编写并链接为目标文件,所以我不确定如何使用gdb
GDB非常适合调试汇编代码。您需要info registers
,x/i $pc
。
我想到的一种方法是在信号处理程序中获取最后一个执行上下文,并记下rip寄存器的值。
那很好(参见Gabriel关于如何获得背景的答案)。
请注意,与崩溃点GDB内部的内容相比,这将不提供任何其他信息。如果您不知道如何首先使用GDB,那么我不会通过在信号处理程序中获取上下文来看到您将获得什么。