【问题标题】:Lldb and OSX crashReportsLldb 和 OSX 崩溃报告
【发布时间】:2014-12-22 19:15:05
【问题描述】:

人,

我刚刚在 OSX 10.9 上工作,手头有一个崩溃要调试。 我看到 OSX 有 LLVM 和 LLDB,它们取代了众所周知且有据可查的 gdb。

无论如何,我在 crashreport 中看到了精确的堆栈跟踪,这对 Apple 来说非常令人印象深刻。 但是,我可以在 lldb 中进行图像查找并打印 API 名称。 当我使用带有图像查找的详细选项时,它会打印一些额外的信息,但是,我仍然无法查看特定 API 中的局部变量。 我尝试了图像转储、图像 sym-tab 等和其他 lldb 选项。 他们似乎都没有帮助。通过 StackOverflow 扫描,看看它是否存在但还没有运气。

因此我有 Q 从 OSX 崩溃报告中,我们无法获得带有局部变量/参数值的堆栈跟踪? 当我们方便地使用 OSX 崩溃报告时,我们如何使用 LLDB 查看函数参数/局部变量。

我看到框架变量等在附加到正在运行的进程时工作正常,但是当我使进程崩溃并尝试查看本地/参数时,这些都不起作用。

请您指导。 谢谢。

【问题讨论】:

    标签: osx-mavericks lldb


    【解决方案1】:

    CrashReporter 输出(主要)包括程序中所有线程的回溯、当时加载的库/框架列表(以及它们的加载地址和 Mach-O UUID,以识别每个二进制文件的构建正在使用)和崩溃帧的寄存器上下文。

    image lookup -va in lldb 将显示参数/变量在给定电脑上的位置。如果此时变量存储在寄存器 rbx 中,image lookup 会说它在 rbx 中。很多时候,一个变量存储在堆栈中,该位置会显示类似rbp-40 的内容,其中 rbp 是 x86_64 上的帧指针寄存器。在这种情况下,这意味着该变量当前在堆栈中的 rbp 值减去 40 时可用。

    崩溃报告不包含任何堆栈内容——它们故意不包含可能敏感的内容。例如,您的程序可能在堆栈局部变量中有一个明文密码。

    如果您感兴趣的变量在崩溃时存储在寄存器中,您可以使用崩溃报告的寄存器上下文部分来确定其中的值。

    通常情况并不那么简单。如果您可以通过汇编语言阅读,找出真正发生了什么的最好方法是反汇编崩溃的函数并使用寄存器上下文信息来了解最终指令导致崩溃的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      相关资源
      最近更新 更多