gdb调试学习与实践笔记 -- 常用命令解析3

目录

disassemble 命令 查看某段代码的汇编指令

set args 、show args 命令 设置及查看命令行参数

tbreak 命令 添加临时断点

watch 命令 监视一个变量或者一段内存

display 命令 监视的变量或者内存地址中断后自动输出值

disassemble 命令 查看某段代码的汇编指令

  • 可能需要查看某段代码的汇编指令去排查问题,或者是在调试一些没有调试信息的发布版程序时,也只能通过反汇编代码去定位问题

gdb调试学习与实践笔记 -- 常用命令解析3

  • GDB 默认反汇编为 AT&T 格式的指令,可以通过 show disassembly-flavor 查看,如果习惯 intel 汇编格式可以用命令 set disassembly-flavor intel 来设置。

gdb调试学习与实践笔记 -- 常用命令解析3

set args 、show args 命令 设置及查看命令行参数

  • 很多程序需要传递命令行参数,在用 GDB 附加程序后,在使用 run 命令之前,使用“set args 参数内容”来设置命令行参数。
  • 例:Redis 启动时可以指定一个命令行参数,它的默认配置文件位于 redis-server 这个文件的上一层目录,可以在 GDB 中这样传递这个参数:set args ../redis.conf
    • 通过 show args 查看命令行参数是否设置成功。

gdb调试学习与实践笔记 -- 常用命令解析3

  • 如果单个命令行参数之间含有空格,可以使用引号将参数包裹起来

gdb调试学习与实践笔记 -- 常用命令解析3

如果想清除掉已经设置好的命令行参数,使用 set args 不加任何参数即可

gdb调试学习与实践笔记 -- 常用命令解析3

tbreak 命令 添加临时断点

  • 字母“t”的意思是 temporarily(临时的),这个命令加的断点是临时的,就是一旦该断点触发一次后就会自动删除。
  • 添加断点的方法与上面介绍的 break 命令相同。

gdb调试学习与实践笔记 -- 常用命令解析3

  • 使用 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 变量名”设置即可。

gdb调试学习与实践笔记 -- 常用命令解析3

  • 使用 display 命令分别添加了寄存器 ebp 和寄存器 eax,ebp 寄存器分别使用十进制和十六进制两种形式输出其值,每次程序中断下来都会自动把这些值打印出来
  • 使用 info display 查看当前已经自动添加了哪些值
  • 使用 delete display 清除全部需要自动输出的变量,使用 delete diaplay 编号 删除某个自动输出的变量。

gdb调试学习与实践笔记 -- 常用命令解析3