目录
- GDB发送信号
- GDB对信号的处理
- 实例
GDB发送信号
在GDB调试状态中,可以在命令号输入signal 信号
来向程序发送信号
GDB处理信号
背景:GDB调试时,能够捕获产生的信号并停止,当频繁有信号产生时,很影响调试
在GDB中handle指令用于设置GDB对于信号的处理,可以输入help handle
来查看
1 | Specify how to handle signals. |
总结大体意思:
- nostop
当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号。 - stop
当被调试的程序收到信号时,GDB会停住你的程序。 - print
当被调试的程序收到信号时,GDB会显示出一条信息。 - noprint
当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。 - pass 、noignore
当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。 - nopass、ignore
当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号
在GDB中可以使用info signals
和info handle
来查看有哪些信号在被GDB检测中和GDB对其的处理
1 | Signal Stop Print Pass to program Description |
实例
例程代码如下
1 | void signalHandle(int para) |
为了效果更佳明显,先运行程序,然后gdb attach到进程上,进入gdb调试模式
1 | (gdb) c |
可以发现当在程序中按下回车时,进程给自己发送了SIGUSR1信号,并且GDB捕获到该信号切停下,我们继续运行,
将GDB对SIGUSR1信号的处理设置为nostop
1 | Program received signal SIGUSR1, User defined signal 1. |
可以发现此时只会打印,而gdb不会停下,接下来
将GDB对SIGUSR1信号的处理设置为noprint
1 | (gdb) handle SIGUSR1 noprint |
此时GDB既不会打印也不会停下
通过GDB给程序发送信号
1 | (gdb) singal SIGUSR2 |
程序命令行打印in signal handle,signal num:12,显然收到SIGUSR2信号