Как я могу узнать, что изменяет объект (или простую переменную) в Xcode 4 / lldb?
В некоторых отладчиках это называется "установка ловушки" на переменную. То, что я хочу сделать, - это вызвать точку останова для любого оператора, который изменяет объект. Или изменяет свойство объекта.
У меня есть NSMutableDictionary, который получает значение/ключ, добавленный к нему, но я не могу найти ни одного оператора, который мог бы это сделать.
2 ответа:
Вы можете установить точку наблюдения (из здесь):
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
точки наблюдения используются для отслеживания записи по адресу в памяти (поведение по умолчанию). Если вы знаете, где находится объект в памяти (у вас есть указатель на него), и вы знаете смещение в объект, который вас интересует, это то, для чего нужны точки наблюдения. Например, в простом примере C, если у вас есть:
struct info { int a; int b; int c; }; int main() { struct info variable = {5, 10, 20}; variable.a += 5; // put a breakpoint on this line, run to the breakpoint variable.b += 5; variable.c += 5; return variable.a + variable.b + variable.c; }
Как только вы окажетесь в точке останова на
variable.a
, Сделайте:(lldb) wa se va variable.c (lldb) continue
И программа остановится, когда
variable.c
будет изменена. (Я не потрудился напечатать полный текст " watch набор команд переменной").С таким сложным объектом, как
NSMutableDictionary
, например, я не думаю, что точки наблюдения сделают то, что вам нужно. Вам нужно будет знать детали реализации макета объектаNSMutableDictionary
, чтобы знать, какое слово (или слова) памяти установить контрольную точку.