【问题标题】:Examine arguments on stack with lldb使用 lldb 检查堆栈上的参数
【发布时间】:2015-11-22 20:54:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: lldb


    【解决方案1】:

    x 实际上是memory read 命令的简写。您可以选择字长,例如这个:

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

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

    【讨论】:

    • 你写的是 esp,但我很确定我确实尝试过使用“x $esp”,但它没有用。也许它只能以长格式工作吗?令人困惑。
    • $esp 对我也不起作用,无论是短格式还是长格式。 lldb 版本 340.4.70
    • $esp 是(32 位)x86 上堆栈指针寄存器的名称。你没有指定你在哪个平台上,所以如果它是例如ARM 那么你需要使用 $sp/$r13。
    【解决方案2】:

    这是你要找的吗?

    (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

    【讨论】:

    • 啊!我一直按照显示的方式寻址寄存器名称,例如“esp”和“$esp”,这不起作用。从来没有想过只尝试“sp”和“$sp”。
    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 2011-04-30
    • 1970-01-01
    • 2011-12-15
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多