安装
ubuntu在root用户下,
apt-get update
apt-get install gdb
基本调试
加入调试信息,需要在结尾加g
gcc –o filename filename.c -g
- **o选项的作用是:**对命令输出结果进行导入操作,这里是把gcc –o a a.c -g的操作结果输出到文件a(文件名可以自定义)中进行保存。
- **g选项的作用是:**在可执行文件中加入源码信息,比如:可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件都嵌入到可执行文件中,而是在调试时必须保证gdb能找到源文件。
常用基本命令
l 相当于list,从第一行开始查看,可以重复操作滚动
break 16 在16行设置断点
break func 在某个函数处设置断点
info break 查看断点信息
r 相当于run 开始运行程序
n 相当于next开始单步执行,遇函数不进
s 相当于step,单步执行遇函数进
c 相当于continue,继续执行
p i 相当于print i,打印某个变量的值
set var i = 0 设置某个变量的值为0
finish 退出函数
q 相当于quit,退出gdb
程序挂掉的core文件分析
开发和使用Unix程序时,有时程序莫名其妙的down了,却没有任何的提示(有时候会提示core dumped),这时候可以查看一下有没有形如core.进程号的文件生成,这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考。
首先需要生成core文件,使用ulimit -a命令查看配置
使用ulimit -c unlimited 设置为没有限制,再去运行故障的程序会生成core文件
运行需要调试的程序
使用gdb ./文件 生成的core文件直接查看段错误的位置
在gdb内使用bt命令可以查看函数的调用栈
调试正在运行中的程序
另一个窗口查看正在运行的进程编号,ps gref|ef filename
gdb filename -p pid号,此时程序就不跑了
bt查看此时程序执行到了哪里
再用n单步执行
多进程多线程调试
调试多进程程序
缺省调试的是父进程
set follow-fork-mode child
r,n,n,直到进入子进程
设置调试模式:set detach-on-fork [on/off],on其它进程运行,off非调试进程被挂起
查看可以调试的进程:info inferiors
切换调试的进程:inferior 进程id
调试多线程程序
下面是shell命令,
在编译的时候把线程库链接进来,gcc -g -o book book.c -lpthread
查看当前运行的进程ps aux | grep book
查看当前运行的轻量级线程 ps -aL | grep book
查看主线程和子线程之间的关系 pstree -p 主线程 id
下面是gdb命令
查看当前一共有多少个线程 info threads
切换线程 thread id
只运行当前线程 set scheduler-locking on
运行全部的线程 set scheduler-locking off
指定某线程执行gdb命令,thread apply 线程id cmd
指定全部线程执行gdb命令,thread apply all cmd
调试多进程多线程存在的问题及解决
设置断点或单步可能干扰多进(线)程之间的竞争状态,导致和真实环境不符。
解决办法:可以采用log日志的方法
cpp有个freecplus框架