Linux下利用GDB调试快速找到Bug

调试程序最让人头疼的就是层出不断的Bug,而且有些Bug不容易定位,下面介绍一种很强大的调试工具:GDB

虽然之前听过GDB调试,但是自己调试时一直没使用过。今天在调试highmac程序时,遇到了一个段错误,即segmentation fault。段错误的原因有指针使用错误,内存访问越界等等很多,所以一时还无法下手。。

但是我请来了师兄,描述了一下现象:简单来说就是,我在主函数中注释掉了一个不需要的线程,采用了注释该线程的创建函数pthread_create(),线程函数体没有动,但是在运行时就出现了段错误问题。我想了想关闭一个线程并不会影响其他线程或者主线程啊,师兄指出肯定是某处指针使用错误了,要不check一下代码,要不我教你GDB吧,于是我就使用了后者。

如下是GDB调试过程:
首先我用”./highmac 2”命令运行了highmac进程(后面的”2”是需要在命令行输入的参数),出现了段错误
这里写图片描述

接下来使用GDB调试,输入”gdb highmac”命令,出现了一堆信息不用管它
这里写图片描述

在光标处用”set args 2”命令发送所需要的参数,然后用”r”命令运行程序。
图中有提示segmentation fault,而且下面紧接着出现了pthread_kill(这个函数的作用是发送信号到指定的线程,且指定的线程必须与调用线程在同一个进程中),这说明段错误应该与pthread_kill()函数有关!
这里写图片描述

接下来使用”bt”命令来显示bug出现的具体位置。可以看出问题出现在hm_main.c文件中的hm_lm2nl_thread线程,位置在hm_main.c文件的第722行
这里写图片描述

check代码后,发现pthread_kill()函数确实向被关闭的hm_rcvfrom_nl_thread线程发送了信号,导致段错误。

if (ESRCH == pthread_kill(rcvfr_nl_tid, 0))
        {
            EPT(stderr, "hm_lm2nl_thread: hm_rcvfrom_nl thread has ended.\n");
            rval = 1;
            stop = 1;
            goto thread_return;
        }
#if 0
    /* create receiving msg thread */
    rval = pthread_create(&rcvfr_nl_tid, NULL, hm_rcvfrom_nl_thread, &(qinfs[re_qin].qid));    /* re_qinΪ±¾½ø³ÌµÄÊý¾Ý¶ÓÁбêºÅ */
    if (rval != 0) {
        EPT(stderr, "%s: can not create hm_rcvfrom_nl thread\n", argv[0]);
        rval = 4;
        goto process_return;
    }
#endif

注释掉pthread_kill()函数后,问题得到解决!

延伸:
1.使用”r”命令可以带参数,如”r 2”,这样前面就不用”set args 2”命令了。
2.GDB功能很多,可以按照你的自定义随心所欲的运行程序;可让被调试的程序在你所指定的调置的断点处停住;当程序被停住时,可以检查此时你的程序中所发生的事(本例子使用的功能);你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。、
3.GDB还有其他命令,需要继续学习!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值