使用 lldb 检查堆栈上的参数

Examine arguments on stack with lldb

我正在使用 lldb 来跟踪一些调用 CoreFoundation 函数的普通 C 或 C++ 代码(32 位),例如 CFRunLoopTimerCreate.

我在 CFRunLoopTimerCreate 上设置了一个断点,想检查传递的参数。

我该怎么做? frame variable 在这里不起作用(它不打印任何内容),因为它不在 ObjC 上下文中。

我想我必须使用 x 命令以某种方式查看上面的内存 sp 但是无论我尝试什么语法,我都会不断收到错误消息。

那么,基本上,检查寄存器指向的地址处的内存的语法是什么?另外,有没有更好的方法来查看堆栈上的参数?

这是您要找的吗?

(lldb) x $sp-10
0x7fff5cd3eda6: 00 00 86 0a ec 02 01 00 00 00 00 00 00 00 00 00  ................
0x7fff5cd3edb6: 00 00 00 00 00 00 00 00 00 00 90 94 33 75 ff 7f  ............3u..

寄存器通常以 $rax 等形式寻址。 您可能还希望查看这个较早的问题,以获取有关缩短 lldb 内存读取命令的一些提示:Dump memory in lldb

对于 memory read 命令,

x 实际上是 shorthand。您可以选择字的大小,例如这个:

memory read --format x --size 4 --count 8 `$esp - 32`

将显示堆栈的前 32 个字节(在 i386 上),格式为 4 字节十六进制数。如果您正在寻找指针值等,这可能会使它更容易。 --format 的参数也可以是 d 用于十进制输出。 --outfile 允许您指定写入内存内容的文件路径,这可能对大量使用更有用。用反引号包围要评估的表达式 `.