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

来源:互联网 发布:python set insert 编辑:程序博客网 时间:2024/05/22 07:48

调试程序最让人头疼的就是层出不断的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还有其他命令,需要继续学习!

0 0
原创粉丝点击