断点和监控点
断点 (breakpoint)
根据函数名或者方法名设置断点
- gdb
- lldb
(gdb) break main
(lldb) breakpoint set --name main
(lldb) br s -n main
(lldb) b main
# or breakpoint on C++ method:
(lldb) breakpoint set --method main
(lldb) br s -M main
根据源文件行号设置断点
- gdb
- lldb
(gdb) break test.c:12
(gdb) b test.c:12
(lldb) breakpoint set --file test.c --line 12
(lldb) br s -f test.c -l 12
(lldb) b test.c:12
设置条件断点
- gdb
- lldb
(gdb) break foo if strcmp(y,"hello") == 0
(lldb) breakpoint set --name foo --condition '(int)strcmp(y,"hello") == 0'
(lldb) br s -n foo -c '(int)strcmp(y,"hello") == 0'
删除某个断点
- gdb
- lldb
(gdb) delete 1
# or delete all breakpoints at current line
(gdb) clear
(lldb) breakpoint delete 1
(lldb) br del 1
禁用/启用断点
-
禁用断点
- gdb
- lldb
(gdb) disable 1
(lldb) breakpoint disable 1
(lldb) br dis 1 -
启用断点
- gdb
- lldb
(gdb) enable 1
(lldb) breakpoint enable 1
(lldb) br en 1
通过正则表达式设置断点
-
通过正则表达式匹配函数,来设置断点
- gdb
- lldb
(gdb) rbreak [REGULAR EXPRESSION]
(lldb) breakpoint set --func-regex [REGULAR EXPRESSION]
(lldb) br s -r [REGULAR EXPRESSION] -
通过正则表达式匹配源文件内容,来设置断点
- gdb
- lldb
(gdb) shell grep -e -n [REGULAR EXPRESSION] [SOURCE FILE]
(gdb) break source-file:line-number(lldb) breakpoint set --source-pattern [REGULAR EXPRESSION] --file [SOURCE FILE]
(lldb) br s -p [REGULAR EXPRESSION] -f [SOURCE FILE]
列出所有断点
- gdb
- lldb
(gdb) info break
(lldb) breakpoint list
(lldb) br l
监控点 (watchpoint)
监控进程中某个变量的值
- gdb
- lldb
(gdb) watch global_var
(lldb) watchpoint set variable global_var
(lldb) wa s v global_var
监控进程中的某块内存
如果未指定 -x byte_size
,则要监视的区域的大小默认为指针大小。
该命令采用原始输入,计算为表达式,返回指向区域开头的无符号整数,位于 --
选项终止符之后。
- gdb
- lldb
(gdb) watch -location g_char_ptr
(lldb) watchpoint set expression -- my_ptr
(lldb) wa s e -- my_ptr
设置监控的条件
- gdb
- lldb
(lldb) watch set var 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
删除监控点
- gdb
- lldb
(gdb) delete 1
(lldb) watchpoint delete 1
(lldb) watch del 1
列出所有的监控点
- gdb
- lldb
(gdb) info break
(lldb) watchpoint list
(lldb) watch l