如您所见,您的步骤 ( image lookup
+ p/x addr + offset
) 将为您提供原始地址。但最初的崩溃报告可能在方法 + 偏移量之前包含一个地址 --- 使用 . 将二进制文件滑动到正确的地址同样容易target modules load
。在崩溃报告的末尾应该有一个程序中存在的二进制图像列表,包括加载地址和 UUID。
但更重要的是,虽然地址很好,但您真正追求的是源位置。在这种情况下,一旦您确定了该方法的正确地址(或通过 将其滑动到匹配地址target modules load
),您可以使用source list
(lldb) so l -a `addr + offset`
我在这里使用反引号表示法,它进行内联表达式评估。大多数带有地址的命令都有一个方便的快捷方式:如果省略空格,则可以编写不带反引号的表达式:
(lldb) so l -a addr+offset
您也可以使用image lookup
地址。如果您有调试信息,这将告诉您此时变量的当前位置。为什么这很有用?因为大多数崩溃报告都包含崩溃时的寄存器上下文,所以当前在寄存器中的任何变量都会提供给您(-v
获取所有寄存器位置信息所必需的)。
(lldb) im loo -v -a addr+offset
最后——这是行不通的,因为你正在处理一个 Objective-C 方法名——但是使用一个简单的 C 函数名,只要你将函数名转换为指针类型(向函数指针添加偏移量是不合法的 C)。例如
(lldb) so l -a (char*)main+10