为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

小唯快跑啊 2019-07-23 16:51:09
我可以在GDB中的'内存访问'上设置断点吗?我正在通过gdb运行应用程序,我想在访问/更改特定变量的任何时候设置断点。有这么好的方法吗?我也有兴趣用其他方法来监视C / C ++中的变量,以查看它是否/何时发生变化。
查看完整描述

3 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

手表上只写符,rwatch让你读破发,并awatch让你打破的读/写。

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

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

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

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

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

gdb$ print $ebx $13 = 0x135700gdb$ rwatch *0x135700+0xec1a04fHardware read watchpoint 3: *0x135700 + 0xec1a04fgdb$ cHardware read watchpoint 3: *0x135700 + 0xec1a04fValue = 0xec34daf0x9527d6e7 in objc_msgSend ()

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

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


查看完整回答
反对 回复 2019-07-23
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您正在寻找的是一个观察点

用法

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

(gdb) watch *(int*)0x12345678:观察地址指向的值,按照您想要的任何类型

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

观察点有三种:

  • watch写入时gdb会中断

  • rwatch:gdb会破坏读取的发生

  • awatch:gdb在两种情况下都会中断

您可以选择更适合您需求的产品。

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


查看完整回答
反对 回复 2019-07-23
?
慕后森

TA贡献1802条经验 获得超5个赞

我只是尝试了以下内容:

 $ cat gdbtest.c
 int abc = 43;
 int main()
 {
   abc = 10;
 }
 $ gcc -g -o gdbtest gdbtest.c
 $ gdb gdbtest
 ...
 (gdb) watch abc
 Hardware watchpoint 1: abc
 (gdb) r
 Starting program: /home/mweerden/gdbtest 
 ...
 Old value = 43
 New value = 10
 main () at gdbtest.c:6
 6       }
 (gdb) quit

所以看起来可能,但你确实需要一些硬件支持。


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 1660 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信