gdb使用

1. 简介

GDB全称GNU symbolic debugger,是GNU开源组织发布的一个强大的Linux下的程序调试工具,GDB主要帮助你完成下面四个方面的功能:

  • 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
  • 可让被调试的程序在你所指定的调置的断点处停住(断点可以是条件表达式)。
  • 当程序被停住时,可以检查此时你的程序中所发生的事。
  • 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

2. 常用命令介绍

r或run:运行一个待调试的程序

c或contine:让暂停的程序继续运行

n或next:运行到下一行

s或step:单步执行,遇到函数会进入

u或until:运行到指定行

fi或finish:结束当前调用的函数,回到上一层函数调用处

return:结束当前调用函数并返回指定值,到上一层函数调用处

j或jump:将当前程序执行流跳转到指定行

  • jump LineNum:跳转到代码的LineNum行的位置
  • jump *address:跳转到address地址的代码处,地址前面要加*

备注:1.跳过的代码不会被执行;2.跳到的位置如果没有断点那么GDB会继续往下执行

p或print:打印变量或寄存器的值

  • print param:用于在调试过程中查看变量的值
  • print param = value:用于在调试过程中修改变量的值为value
  • print a+b+c:可以进行一定的表达式运算
  • print func():输出func函数的执行结果,常见用途是打印系统函数执行失败的原因:print strerror(errno)
  • print *this:在C++对象中,可以输出当前对象的各成员变量的值

print不同类型的值

  • p/x:十六进制显示
  • p/d:十进制显示
  • p/u:无符号十进制显示
  • p/o:八进制显示
  • p/t:二进制显示
  • p/a:地址格式显示
  • p/c:字符串格式显示
  • p/f:浮点数格式显示
  • p/s:字符串格式显示

bt或backtrace:查看当前线程的栈调用

f或frame:切换到当前调用线程的指定堆栈

thread:切换到指定线程

b或break:添加断点

  • break FuncName,在函数的入口添加断点
  • break LineNum,在当前文件行号为LineNum的代码处添加断点
  • break FileName:LineNum,在FileName文件的第LineNum行处添加断点
  • break FileName:FuncName,在FileName文件的FuncName函数入口处添加断点
  • break -/+offset,在当前程序暂停位置的前/后offset行除添加断点
  • break … if cond, 添加条件断点

tb或tbreak:添加临时断点(第一次执行到后会自动清除,使用方法同break)

d或delete:删除断点

enable:启用某个断点

disable:禁用某个断点

i或info:查看断点或线程信息

i/info b,显示当前所有断点的信息

watch:监视某一个变量或内存地址的值是否发生变化

l或list:显示源码

  • list -,显示上一次list命令显示的代码前面的代码
  • list LineNum,显示当前代码文件第LineNum行附近的代码
  • list FileName:LineNum,显示FileName文件第LineNum行附近的代码
  • list FuncName,显示当前文件FuncName函数附近的代码
  • list FileName:FuncName,显示FileName文件的Fun从Name函数附近的代码
  • list LineNum1,LineNum2,显示LineNum1到LineNum2之间的代码

备注:list默认只会输出10行源代码,可以通过show listsize确认list命令显示的代码行数,set listsize count设置list命令显示的的代码行数为conut

ptype:查看变量类型

dis或disassemble:查看汇编代码

set args:设置程序启动命令行参数

show args:查看设置的命令行参数

3. GDB的调试方式

  • 直接调试目标程序
  • 附加进程id
  • 调试core文件

4. GDB的退出

可以输入命令q或quit退出,或者Ctrl+d退出
如果GDB attach某个进程,退出GDB之前要用命令detach解除附加进程

5. 参考文件