如何在信号处理程序中获取执行上下文?

时间:2012-04-28 16:58:29

标签: c linux signals x86-64

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

  

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

GDB非常适合调试汇编代码。您需要info registersx/i $pc

  

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

那很好(参见Gabriel关于如何获得背景的答案)。

请注意,与崩溃点GDB内部的内容相比,这将提供任何其他信息。如果您不知道如何首先使用GDB,那么我不会通过在信号处理程序中获取上下文来看到您将获得什么。