Debugging 如何在Xcode 4/lldb中找出改变对象(或简单变量)的原因?

Debugging 如何在Xcode 4/lldb中找出改变对象(或简单变量)的原因?,debugging,xcode4,lldb,watchpoint,Debugging,Xcode4,Lldb,Watchpoint,在某些调试器中,这称为变量的“设置陷阱”。我要做的是在任何更改对象的语句上触发断点。或更改对象的属性 我有一个NSMutableDictionary,其中添加了一个值/键,但我找不到任何可以这样做的语句。您可以设置一个观察点(从): 监视点用于跟踪对内存中地址的写入(默认行为)。如果你知道一个对象在内存中的位置(你有一个指向它的指针),并且你知道你所关心的对象的偏移量,这就是观察点的作用。例如,在一个简单的C示例中,如果您有: 结构信息 { INTA; int b; INTC; }; int m

在某些调试器中,这称为变量的“设置陷阱”。我要做的是在任何更改对象的语句上触发断点。或更改对象的属性

我有一个NSMutableDictionary,其中添加了一个值/键,但我找不到任何可以这样做的语句。

您可以设置一个观察点(从):

监视点用于跟踪对内存中地址的写入(默认行为)。如果你知道一个对象在内存中的位置(你有一个指向它的指针),并且你知道你所关心的对象的偏移量,这就是观察点的作用。例如,在一个简单的C示例中,如果您有:

结构信息 { INTA; int b; INTC; }; int main() { 结构信息变量={5,10,20}; variable.a+=5;//在此行放置一个断点,运行到断点 变量b+=5; 变量c+=5; 返回变量.a+变量.b+变量.c; } 一旦您在
变量a上的断点处,请执行以下操作:

(lldb)wa se va variable.c
(lldb)继续
variable.c
被修改时,程序将暂停。(我没有费心输入完整的“watchsetvariable”命令)


例如,对于像
NSMutableDictionary
这样的复杂对象,我认为监视点无法满足您的需要。您需要了解
NSMutableDictionary
对象布局的实现细节,才能知道要设置观察点的内存单词。

它在gdb和lldb中称为观察点-有关如何设置和使用观察点,请参阅联机帮助。您引用的writeup确实不清楚。您提供的链接帮助很大,但它没有解释或示例说明如何查看对象(只有简单的变量)。在对不同形式的watch命令进行了大量实验后,我发现我可以通过以下方式查看NSString:
watch set exp-w write--&testString
,但我找不到任何可靠地监视NSMutableDictionary的watch命令语法,这是最初的问题。@RobertL我认为除了内置的帮助之外,关于lldb的文档不多。是的,这似乎是真的。而内置的帮助似乎只是为了提醒您命令语法,而不是解释任何东西。我想教程风格的文档最终会被开发出来。在那之前,我们需要试验或等待。此外,我还发现一些被lldb接受的watch语句实际上会在运行时导致崩溃。这可能也会随着时间的推移而改善(要么被拒绝,要么不崩溃)。
Set a watchpoint on a variable when it is written to.
(lldb) watchpoint set variable -w write global_var
(lldb) watch set var -w write global_var
(gdb) watch global_var
Set a watchpoint on a memory location when it is written into. The size of the region to watch for defaults to the pointer size if no '-x byte_size' is specified. This command takes raw input, evaluated as an expression returning an unsigned integer pointing to the start of the region, after the '--' option terminator.
(lldb) watchpoint set expression -w write -- my_ptr
(lldb) watch set exp -w write -- my_ptr
(gdb) watch -location g_char_ptr
Set a condition on a watchpoint.
(lldb) watch set var -w write global
(lldb) watchpoint modify -c '(global==5)'
(lldb) c
...
(lldb) bt
* thread #1: tid = 0x1c03, 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16, stop reason = watchpoint 1
frame #0: 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16
frame #1: 0x0000000100000eac a.out`main + 108 at main.cpp:25
frame #2: 0x00007fff8ac9c7e1 libdyld.dylib`start + 1
(lldb) frame var global
(int32_t) global = 5
List all watchpoints.
(lldb) watchpoint list
(lldb) watch l
(gdb) info break
Delete a watchpoint.
(lldb) watchpoint delete 1
(lldb) watch del 1
(gdb) delete 1