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

Mac*_*ger 8 debugging macos xcode lldb

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

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

Jas*_*nda 4

是的,正确的方法是通过 Python 脚本接口。我们特意决定避免 gdb 在调试器的命令语言中塞满足够的流控制和执行逻辑的方法,以使其成为可能(或者更确切地说,使其成为可能……很糟糕)。与这种方法不同的是,您需要使用 Python 来完成任务的门槛较低,但可以通过 Python 中的一些非常易于使用的界面来使用调试器的全部功能。lldb 将脚本语言留给了 Python,并专注于提供一个干净而强大的 API,易于在 Python 中使用。

但为了实现您的目标,为什么设置不能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) 
Run Code Online (Sandbox Code Playgroud)

lldb 的默认行为是在单步执行程序时显示某种上下文。如果源代码可用,它将显示您正在单步执行的源代码。如果没有源,则会显示即将执行的汇编指令。当您有调试信息(因此调试器知道文件和行号)但源代码不可用(或位于不同的路径)时,会出现一个小错误 - 现在 lldb 将向您显示反汇编,但这不是正确的行为这个案例。用户仍然在源代码级别进行操作(使用snto 单步执行,而不是sini用于指令级别单步执行),并且 lldb 在这种情况下不应显示任何上下文,只显示源文件名和行号。