使用 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
允许您指定写入内存内容的文件路径,这可能对大量使用更有用。用反引号包围要评估的表达式 `.
我正在使用 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
允许您指定写入内存内容的文件路径,这可能对大量使用更有用。用反引号包围要评估的表达式 `.