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还有其他命令,需要继续学习!
- Linux下利用GDB调试快速找到Bug
- 在Linux下利用GDB调试程序
- gdb调试-带你快速掌握Linux下程序调试
- LINUX下GDB调试
- LINUX下GDB调试
- LINUX下GDB调试
- LINUX下GDB调试
- LINUX下GDB调试
- linux下gdb调试
- Linux下GDB调试
- LINUX下GDB调试
- LINUX下GDB调试
- LINUX下GDB调试
- Linux下GDB调试
- Linux 下GDB调试
- linux下GDB调试
- linux下GDB调试
- LINUX下GDB调试
- web前台
- 并查集
- Mac下修改Android Studio 所用的JDK版本
- android library引用失败,出现红叉叉解决办法
- 项目开发心得
- Linux下利用GDB调试快速找到Bug
- 关于寻找素因数的三种方法
- linux chmod 755
- 我的Java之旅 第五课 JAVA 语言语法 集合
- Ubuntu15安装Redis
- Erlang中的循环
- Java三大特性——继承,封装和多态
- 简单的java实现邮箱发送邮件
- LeetCode-Best Time to Buy and Sell Stock II