如何在 LLDB 中将表达式设置为观察点?
How to set an expression as a watchpoint in LLDB?
这是一个程序:
int main(int argc, char **argv) {
int *arr = NULL;
arr = malloc(2 * sizeof(*arr));
arr[0] = 1;
arr[1] = 2;
return 0; // break is here
}
我想在休息时检查 arr
的内容。这是我通常的做法:
$ lldb main
(lldb) break set -l 266
(lldb) run
Process 9093 launched: '..../main' (x86_64)
Process 9093 stopped
* thread #1, name = 'main', stop reason = breakpoint 1.1
frame #0: 0x0000555555555314 main`main(argc=1, argv=0x00007fffffffe018) at main.c:266
263 arr = malloc(2 * sizeof(*arr));
264 arr[0] = 1;
265 arr[1] = 2;
-> 266 return 0;
267 }
(lldb) x/d -c 2 arr
0x555555757260: 1
0x555555757264: 2
(lldb) p *(int(*)[2])arr
(int [2]) = ([0] = 1, [1] = 2)
一切都很好 - 内容按预期打印,但问题是我希望 LLDB 在我执行单步执行时为我执行此操作。那么我如何设置一个观察点(通过 watch set var ...
或 watch set expr ...
)以在每个 step
?
上自动打印这些值
我想你想在这里使用 stop-hook
。
target stop-hook add -o 'p *(int(*)[2])arr'
如果您在 target stop-hook add
之后点击 return,您可以在每一站输入多个命令。当您停在某些源文件、函数、某些 solib 等时,此命令需要 许多 个选项 运行,它非常灵活。
这是一个程序:
int main(int argc, char **argv) {
int *arr = NULL;
arr = malloc(2 * sizeof(*arr));
arr[0] = 1;
arr[1] = 2;
return 0; // break is here
}
我想在休息时检查 arr
的内容。这是我通常的做法:
$ lldb main
(lldb) break set -l 266
(lldb) run
Process 9093 launched: '..../main' (x86_64)
Process 9093 stopped
* thread #1, name = 'main', stop reason = breakpoint 1.1
frame #0: 0x0000555555555314 main`main(argc=1, argv=0x00007fffffffe018) at main.c:266
263 arr = malloc(2 * sizeof(*arr));
264 arr[0] = 1;
265 arr[1] = 2;
-> 266 return 0;
267 }
(lldb) x/d -c 2 arr
0x555555757260: 1
0x555555757264: 2
(lldb) p *(int(*)[2])arr
(int [2]) = ([0] = 1, [1] = 2)
一切都很好 - 内容按预期打印,但问题是我希望 LLDB 在我执行单步执行时为我执行此操作。那么我如何设置一个观察点(通过 watch set var ...
或 watch set expr ...
)以在每个 step
?
我想你想在这里使用 stop-hook
。
target stop-hook add -o 'p *(int(*)[2])arr'
如果您在 target stop-hook add
之后点击 return,您可以在每一站输入多个命令。当您停在某些源文件、函数、某些 solib 等时,此命令需要 许多 个选项 运行,它非常灵活。