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