Search code examples
debuggingxcode4lldbwatchpoint

How can I find out what is changing an object (or a simple variable) in Xcode 4 / lldb?


In some debuggers this is called "setting a trap" on a variable. What I want to do is trigger a breakpoint on any statement that changes the object. Or changes a property of the object.

I have an NSMutableDictionary that gets a value/key added to it but I can't find any statement that could be doing that.


Solution

  • You can set a watchpoint (from here):

    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