我可以在 GDB 中的“内存访问”上设置断点吗?

新手上路,请多包涵

我正在通过 gdb 运行应用程序,并且我想在任何时候访问/更改特定变量时设置断点。有没有这样做的好方法?我也对在 C/C++ 中监视变量以查看它是否/何时更改的其他方法感兴趣。

原文由 TJ Seabrooks 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

watch 只在写时中断, rwatch 让你在读时中断, awatch 让你在读/写时中断。

您可以在内存位置设置读取观察点:

 gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface

但一个限制适用于 rwatch 和 awatch 命令;您不能在表达式中使用 gdb 变量:

 gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.

所以你必须自己扩展它们:

 gdb$ print $ebx
$13 = 0x135700
gdb$ rwatch *0x135700+0xec1a04f
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
gdb$ c
Hardware read watchpoint 3: *0x135700 + 0xec1a04f

Value = 0xec34daf
0x9527d6e7 in objc_msgSend ()

编辑: 哦,顺便说一句。您需要硬件 或软件支持。软件显然要慢得多。要了解您的操作系统是否支持硬件观察点,您可以查看 can-use-hw-watchpoints 环境设置。

 gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.

原文由 asksol 发布,翻译遵循 CC BY-SA 2.5 许可协议

您要查找的内容称为 watchpoint

用法

(gdb) watch foo :观察 变量 的值 foo

(gdb) watch *(int*)0x12345678 :观察 地址 指向的值,转换成你想要的任何类型

(gdb) watch a*b + c/d :观察任意 复杂的表达式,在程序的母语中有效

观察点分为三种:

  • watch : 发生 写入 时 gdb 将中断
  • rwatch :gdb 将在发生 读取 时中断
  • awatch : gdb 在 这两种情况下 都会中断

您可以选择更适合您需要的。

有关更多信息,请查看 内容。

原文由 Paolo M 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题