将信号用作 Linux 调试工具 - From IBMDW

时间:2021-09-10 01:38:51
本文介绍了如何用信号来调试一个程序。众所周知,在Linux编程中,经常会遇到程序segment fault或其他类似的错误,这些错误比较难调试,本文就介绍了用信号来调试这种错误的方法。

当一个程序访问一个未分配内存的地址时或其他情况时,会产生segment fault错误,此时程序会产生一个SIGSEGV的信号,所以,我们的程序可以捕获这个信号,并打印出是哪条指令导致了该错误,及产生该错误时CPU各寄存器的值,从而定位出问题所在。

本文举了两个很好的例子,一个是对SIGILL信号的处理,比如,当一个应用程序执行了一个不被允许的操作(比如用汇编执行保存/恢复CPU特权 寄存器的指令),这种操作在用户空间中是不被允许的,只有内核程序采用使用这种指令,那么,此时,程序就会产生一个SIGILL的信号,我们的程序可以捕 获这个信号,同时将产生该信号的指令和当前CPU寄存器的值打印到一个文件中,然后退出。OK,有了这些信息后,我们就可以用objdump来查看我们的 二进制程序文件,找到相应的指令,然后就可以分析出是程序的哪句代码导致了该错误了,赞啊!

如果我们在编译程序的时候,加上了 -g 这个选项,那么,在objdump的输出中,还会在相应的汇编代码处加上源代码,这就更方便我们定位代码错误了!

本文第二个例子就是给一个未分配内存空间的指针赋值,显然,这会产生SIGSEGV信号,同样的,我们捕获这个信号,并将指令和CPU寄存器的值打印出来,然后用objdump分析二进制文件,就可以找到是哪句代码导致了该错误了!