我们写代码时,有时会自定义signal的处理函数,然后调试时想调试这个处理函数,该怎么做呢?
例子
main.c代码如下,运行系统是debian11。main.c里自定义了信号SIGINT和SIGTERM的处理函数,
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
bool Running = true;
static void sigHandler(int sign)
{
Running = false;
}
int main()
{
signal(SIGINT, sigHandler);
signal(SIGTERM, sigHandler);
while (Running)
{
sleep(1);
}
return 0;
}
PS:我们平时使用CTRL+C去中断程序,其实就是向程序发送了SIGINT信号。
本人使用VSCode的native debug插件进行调试,事先要安装好gdb,这里先打2个断点,
- 第一个打在sigHandler里的"Running = false;"这一行
- 第二个打在"sleep(1);"这一行
如下,  然后启动调试(第二个断点也可以启动运行后一段时间再打),调试启动后,会运行到"sleep(1)"这一行,  此时打开gdb的控制台(VSCode里使用Ctrl+`打开),输入"signal SIGINT"并回车,  这时就会进入信号处理函数里,  PS: 对于其它各种信号,可以在gdb的控制台输入"info signals"去查看。
关键一点是:发送信号前要把程序停下来,可以根据需要停在程序的某个位置。
其它参考
gdb下对信号还有其它配置,可以参考这里
|