人,
我刚刚开始使用OSX 10.9,并且手头有崩溃进行调试。 我看到OSX有LLVM和LLDB,它取代了众所周知且记录良好的gdb。
无论如何,我在crashreport中看到了精确的堆栈跟踪,这在Apple中非常令人印象深刻。 但是,我可以在lldb中进行图像查找并打印API名称。 当我使用详细选项和图像查找时,它会打印一些额外的信息,但是,我仍然无法在特定的API中查看局部变量。 我尝试了图像转储,图像sym-tab等和其他lldb选项。 他们似乎都没有帮助。通过StackOverflow扫描,看看它是否存在但尚未运气。
因此我有Q. 从OSX crashreports我们无法获得具有局部变量/参数值的堆栈跟踪? 当我们使用OSX崩溃报告时,我们如何使用LLDB查看函数参数/局部变量。
我看到框架变量等在附加到正在运行的进程时工作正常,但是当我崩溃进程并尝试查看本地/参数时这些不起作用。
请您指导。 谢谢你。
答案 0 :(得分:0)
CrashReporter输出(主要)包含程序中所有线程的回溯,当时加载的库/框架列表(带有加载地址和Mach-O UUID以识别每个二进制文件的构建)正在使用)和崩溃的帧的寄存器上下文。
lldb中的 image lookup -va
将显示参数/变量在给定pc处的位置。如果变量在该点存储在寄存器rbx中,image lookup
将表示它在rbx中。通常情况下,变量存储在堆栈中,并且位置会说rbp-40
,其中rbp是x86_64上的帧指针寄存器。在这种情况下,这意味着变量当前在堆栈上可用,其值为rbp减去40。
崩溃报告不包含任何堆栈内容 - 它们故意不包含可能敏感的内容。例如,您的程序可能在堆栈本地变量中有明文密码。
如果您感兴趣的变量在崩溃时存储在寄存器中,您可以使用崩溃报告的寄存器上下文部分来确定其中的值。
通常它并不那么简单。如果您可以通过汇编语言阅读,那么找出实际情况的最佳方法是反汇编崩溃函数并使用寄存器上下文信息来理解最终指令导致崩溃的原因。