LLDB将多个命令的别名合二为一

时间:2013-01-31 23:29:54

标签: xcode macos debugging lldb

我正在尝试调试我没有源代码的库,所以我正在使用LLDB反汇编。我想知道是否有一种方法可以在每次调用'thread step-in'后自动运行反汇编。目前,当我执行'thread step-in'时,LLDB执行该指令,然后返回一个空白提示符。为了看看,EIP移动到哪里,我需要在每个线程步入后键入反汇编,这非常令人分心和烦人(同样,LLDB似乎不会用';'结束表达式,因此在一行上放置多个命令不会工作。)

更一般地说,我想知道是否有办法连续为多个LLDB命令创建别名:例如,可以打印%rdi内容的单个别名,然后在EIP周围反汇编10行。 (是的,我可以为它编写python脚本,但我手上没有那么多时间: - (

1 个答案:

答案 0 :(得分:2)

是的,正确的方法是通过Python脚本界面。有人故意决定避免gdb在调试器的命令语言中塞入足够的流控制和执行逻辑的方法,以使其成为可能(或者更确切地说 - 使其成为可能......很糟糕)。您需要使用Python来完成任务,而不是那种方法,但是通过Python中一些非常易于使用的界面可以获得调试器的全部功能。 lldb将脚本语言留给了Python,并专注于提供一个易于使用的简洁易用的API。

但为了实现您的目标,为什么stop-disassembly-count设置不能满足您的需求?实际上,除非您通过更改~/.lldbinit的默认设置禁用了stop-disassembly-display文件中的反汇编显示,否则它应该已经执行了您想要的操作。

(lldb) settings show stop-disassembly-count
stop-disassembly-count (int) = 4
(lldb) settings show stop-disassembly-display
stop-disassembly-display (enum) = no-source
(lldb) 

lldb的默认行为是在单步执行程序时显示某些类型的上下文。如果源代码可用,它将显示您正在逐步完成的源代码。如果没有源,它将显示即将执行的汇编指令。当您有调试信息时(因此调试器知道文件和行号)但是源代码不可用(或在不同的路径上)有一个小错误 - 现在lldb将显示反汇编,但这不是正确的行为这个案例。用户仍然在源级别运行(使用sn来代替sini进行指令级步进,而lldb应该不显示上下文这个例子,只显示源文件名和行号。