目录
disassemble 命令 查看某段代码的汇编指令
- 可能需要查看某段代码的汇编指令去排查问题,或者是在调试一些没有调试信息的发布版程序时,也只能通过反汇编代码去定位问题
- GDB 默认反汇编为 AT&T 格式的指令,可以通过 show disassembly-flavor 查看,如果习惯 intel 汇编格式可以用命令 set disassembly-flavor intel 来设置。
set args 、show args 命令 设置及查看命令行参数
- 很多程序需要传递命令行参数,在用 GDB 附加程序后,在使用 run 命令之前,使用“set args 参数内容”来设置命令行参数。
- 例:Redis 启动时可以指定一个命令行参数,它的默认配置文件位于 redis-server 这个文件的上一层目录,可以在 GDB 中这样传递这个参数:set args ../redis.conf
- 通过 show args 查看命令行参数是否设置成功。
- 如果单个命令行参数之间含有空格,可以使用引号将参数包裹起来
如果想清除掉已经设置好的命令行参数,使用 set args 不加任何参数即可
tbreak 命令 添加临时断点
- 字母“t”的意思是 temporarily(临时的),这个命令加的断点是临时的,就是一旦该断点触发一次后就会自动删除。
- 添加断点的方法与上面介绍的 break 命令相同。
- 使用 tbreak 命令在 main() 函数处添加了一个断点,当断点触发后,再次运行程序不再触发断点,因为这个临时断点已经被删除。
watch 命令 监视一个变量或者一段内存
- 当这个变量或者该内存处的值发生变化时,GDB 就会中断下来
- 被监视的某个变量或者某个内存地址会产生一个 watch point(观察点)
- watch 命令可以通过添加硬件断点来监视数据变化。
- watch 命令的使用方式是“watch 变量名或内存地址”。
- 形式一:整型变量 int i; watch i
- 形式二:指针类型 char *p; watch p 与 watch *p
- 注意:watch p 与 watch *p 是有区别的
- 前者是查看 *(&p),是 p 变量本身
- 后者是 p 所指内存的内容。查看地址目的是要看某内存地址上的数据是怎样变化的。
- 形式三:watch 一个数组或内存区间 char buf[128]; watch buf
- 这里是对 buf 的 128 个数据进行了监视,此时不是采用硬件断点,而是用软中断实现的。
- 用软中断方式去检查内存变量是比较耗费 CPU 资源的,精确地指明地址是硬件中断。
- 注意:当设置的观察点是一个局部变量时,局部变量无效后,观察点也会失效。
display 命令 监视的变量或者内存地址中断后自动输出值
- 监视的变量或者内存地址,每次程序中断下来都会自动输出这些变量或内存的值
- 例如,假设程序有一些全局变量,每次断点停下来都希望 GDB 可以自动输出这些变量的最新值,那么使用“display 变量名”设置即可。
- 使用 display 命令分别添加了寄存器 ebp 和寄存器 eax,ebp 寄存器分别使用十进制和十六进制两种形式输出其值,每次程序中断下来都会自动把这些值打印出来
- 使用 info display 查看当前已经自动添加了哪些值
- 使用 delete display 清除全部需要自动输出的变量,使用 delete diaplay 编号 删除某个自动输出的变量。