内存地址上的观察点
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内核中的变量(内存地址)更改,并在更改时打印堆栈跟踪?