内存地址上的观察点

Posted

技术标签:

【中文标题】内存地址上的观察点【英文标题】:Watch points on memory address 【发布时间】:2014-01-30 14:06:22 【问题描述】:

随着从 gdb 到 lldb 的新变化,我找不到如何在某些内存地址上设置观察点的方法。

在gdb中我使用了这个

watch -location *0x123456

在 lldb 中做同样的事情

w s e *0x123456

不适合我。 那么我可以使用什么来在 lldb 中运行相同的命令呢?

【问题讨论】:

【参考方案1】:

在lldb中设置观察点时省略“解引用操作符”*,直接传递地址即可:

watchpoint set expression -- 0x123456
# short form:
w s e -- 0x123456

在内存位置0x123456 设置观察点。您可以选择使用--size 设置要观看的字节数。简短示例:

w s e -s 2 -- 0x123456

您还可以在变量上设置观察点:

watchpoint set variable <variable>
# short form:
w s v <variable>

示例: 使用以下代码并在第二行设置断点:

int x = 2;
x = 5;

我是在 Xcode 调试器控制台中完成的:

(lldb) p&x (int *) $0 = 0xbfffcbd8 (lldb) w se -- 0xbfffcbd8 已创建观察点:观察点 1:addr = 0xbfffcbd8 大小 = 4 状态 = 启用类型 = w 新值:2 (lldb) n 观察点 1 命中: 旧值:2 新值:5 (lldb)

更简单地说,我可以设置观察点

(lldb) w s v x 已创建观察点:观察点 1:addr = 0x7fff5fbff7dc 大小 = 4 状态 = 启用类型 = w 声明@'/Users/martin/Documents/tmpprojects/watcher/watcher/main.c:16' 观察点规范 = 'x'

【讨论】:

我明白了:要观看的地址的错误表达式评估失败,表达式评估 @user3001909:奇怪,我已经测试过了。 - 我添加了一个例子。 我试过你的例子,lldb 说使用未声明的标识符 'x' 。然后做了 w s e - 0xOFFSET 并且它起作用了。观察点已创建:观察点 1:addr = 0xOFFSET size = 4 state ... 新值:10。谢谢! 自从我升级到 Yosemite 并且还必须更新 Xcode 后,我也遇到了同样的错误。您如何说明从该地址观察的字节范围? @Tylerc230:现在好像是--size-s。答案已更新。

以上是关于内存地址上的观察点的主要内容,如果未能解决你的问题,请参考以下文章

调试 – 观察Linux内核中的变量(内存地址)更改,并在更改时打印堆栈跟踪?

Windows 逆向CE 地址遍历工具 ( CE 结构剖析工具 | 从内存结构中根据寻址路径查找子弹数据的内存地址 )

虚拟内存和地址空间

内存

linux进程内存相关

获取一个进程的所有物理地址上的内存