编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o main
常用命令
回车键:重复上一命令
(gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h
(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r
(gdb)start:单步执行,运行程序,停在第一执行语句
(gdb)list:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l
(gdb)set:设置变量的值
(gdb)next:单步调试(逐过程,函数直接执行),简写n
(gdb)step:单步调试(逐语句:跳入自定义函数内部执行),简写s
(gdb)backtrace:查看函数的调用的栈帧和层级关系,简写bt
(gdb)frame:切换函数的栈帧,简写f
(gdb)info:查看函数内部局部变量的数值,简写i
(gdb)finish:结束当前函数,返回到函数调用点
(gdb)continue:继续运行,简写c
(gdb)print:打印值及地址,简写p
(gdb)quit:退出gdb,简写q
(gdb)break+num:在第num行设置断点,简写b
b 函数名
b 行号
b 文件名:行号
b 行号 if条件
(gdb)info breakpoints:查看当前设置的所有断点
(gdb)delete breakpoints num:删除第num个断点,简写d
(gdb)display:追踪查看具体变量值
(gdb)undisplay:取消追踪观察变量
(gdb)watch:被设置观察点的变量发生修改时,打印显示
(gdb)i watch:显示观察点
(gdb)enable breakpoints:启用断点
(gdb)disable breakpoints:禁用断点
(gdb)x:查看内存x/20xw 显示20个单元,16进制,4字节每单元
(gdb)run argv[1] argv[2]:调试时命令行传参
(gdb)set follow-fork-mode child#Makefile项目管理:选择跟踪父子进程(fork())
core文件:先用$ ulimit -c 1024 开启core,当程序出错会自动生成core文件。调试时 gdb a.out core
ctrl+c:退出输入
gdb的命令行中输入list
或者其简写l
可以查看到程序的源码以及行号
如上输入l
之后,默认会显示10行源代码,按回车之后会显示接下来的10行,直到文件的末尾。
在gdb命令行环境中输入wi
命令,可以让我们进入可视化调试环境,这个环境可以看到源代码,所使用的调试命令与上面讲到的一致。
断点
保存断点到文件:save breakpoint fig.dp
加载断点:gdb hello2 -x fig.dp
打印
p <variable name>
/print <variable name>
可以查看某一个变量的当前值
print i (p i) 查看变量的值
ptype 查看变量类型
print array 查看数组
print *array@len 查看动态内存
print x=5 改变运行时的数据
print &array 查看数组的地址
core文件
在程序崩溃时,一般会生成一个文件叫core文件。core文件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生成的过程叫做core dump。
首先系统得设置了生成core文件,否则程序奔溃时也不会生成core文件。通过ulimit -a |grep core查看当前的配置。
结果可能如下:core file size (blocks, -c) 0
如果结果如上,那么就需要设置core file的大小:ulimit -c 200
ulimit -c 数字 ,其中数字表示的是Blocks的个数,blocks的大小和系统有关。ulimit -c unlimited 则不限制生成的core文件大小
那么,如果用GDB加载已经生成的core文件呢?
假设测试程序是CoreTest,Core文件名为core.4393,那么通过gdb加载core文件的方式是:
gdb ./CoreTest core.4393
也就是说gdb 程序名 core文件名
参考资料
1. https://yq.aliyun.com/articles/243871
2. https://www.cnblogs.com/tangtangde12580/p/8045980.html
3. https://andrewpqc.github.io/2018/11/25/gcc-and-gdb/
4. https://blog.youkuaiyun.com/u011068702/article/details/53931648
