如何在 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 等时,此命令需要 许多 个选项 运行,它非常灵活。