分享

GDB调试signal的处理函数

 补丁牛仔裤 2023-05-10 发布于广东

我们写代码时,有时会自定义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下对信号还有其它配置,可以参考这里

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多