GDB 调试方法
1. 安装gdb并调试
#centos yum安装
sudo yum install gdb
#ubuntu apt安装
sudo apt install gdb
gdb main #调试程序
r #运行
bt #显示调试堆
2. 基础行号断点
# break filename:linenumber
break main.c:10 # 在main.c第10行设置断点
3. 函数断点
# break filename:functionname
break main.c:test # 在main.c的test函数入口设断点
4. 条件断点
# break filename:linenumber if condition
break main.c:47 if len > 0 # 当len>0时触发断点
5. 列出所有断点
info breakpoints
6. 删除文件断点
delete breakpoint_number # 根据info显示的编号删除
delete filename:linenumber # 直接指定文件行删除
注意breakpoint_number通过info breakpoints 查看。
filename设置断点文件名如:main.c,linenumber 所在的文件行号。
7. 基础单步命令
执行下一行代码并进入函数内部,适用于跟踪函数调用细节
step #(缩写 s)
执行下一行代码但不进入函数,直接跳过函数调用
next #(缩写 n)
执行下一条机器指令(汇编级别),用于底层调试
stepi #(缩写 si)
恢复程序运行直到下一个断点或程序结束
continue #(缩写 c)
执行完当前函数并返回到调用点
finish
8. 查看上下文
list
9. 查看变量值
print variable_name # 缩写 p test
variable_name 需要查看的代码变量名,如:argc
10. 跳过循环
在循环体内使用 until 直接执行到循环结束
until 20 # 跳转到第20行
使用 thread 切换线程后单步执行
thread 2
step
gdb 如何使用core文件调试?
#gdb -c core文件路径 [应用程序的路径]
gdb -c core.xxx #core.xxx core dump文件信息
进去后输入where回车, 就可以显示程序在哪一行down掉的, 在哪个函数中.
为什么没有core文件生成呢?
有时候程序down了, 但是core文件却没有生成. core文件的生成跟你当前系统的环境设置有关系, 可以用下面的语句设置一下, 然后再运行程序便成生成core文件.
ulimit -c #查看是否生成core
结果:0,或者 1024, 1024是随便取的,要是core文件大于1024个块,就产生不出来了。
没有找到core文件,我们改改ulimit的设置,让它产生。
ulimit -c unlimited