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

本文介绍了GDB中的多种调试技巧,包括使用disassemble命令查看汇编指令、利用setargs和showargs管理命令行参数、借助tbreak添加临时断点、通过watch监视变量或内存变化以及运用display命令自动显示变量值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

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

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

tbreak 命令 添加临时断点

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

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

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 编号 删除某个自动输出的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值