我正在尝试调试一个我没有源的库,所以我经常使用 LLDB 反汇编。我想知道是否有一种方法可以在每次调用“线程介入”后自动运行反汇编。目前,当我执行 'thread step-in' 时,LLDB 会执行指令,然后返回空白提示。要查看 EIP 移动到的位置,我需要在每次线程介入后键入 disassemble,这非常令人分心和烦人(此外,LLDB 似乎不会以 ';' 结束表达式,因此将多个命令放在一行上不会不行。)
更一般地说,我想知道是否有办法为多个 LLDB 命令连续创建别名:例如,可以打印 %rdi 内容的单个别名,然后在 EIP 周围反汇编 10 行。 (是的,我可以为它编写 python 脚本,但我手头没有那么多时间 :-(
最佳答案
是的,正确的方法是通过 Python 脚本接口(interface)。有一个深思熟虑的决定来避免 gdb 的方法,即在调试器的命令语言中塞满足够的流控制和执行逻辑以使这成为可能(或者更确切地说 - 使其成为可能......糟糕)。与这种方法不同,您需要使用 Python 来完成任务的阈值很低——但调试器的全部功能可以通过 Python 中一些非常易于使用的接口(interface)获得。 lldb 将脚本语言留给了 Python,并专注于提供一个干净而强大的 API,该 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)
lldb 的默认行为是在您单步执行程序时显示某种上下文。如果源代码可用,它将显示您正在单步执行的源代码。如果没有源,它将显示即将执行的汇编指令。当您有调试信息(因此调试器知道文件和行号)但源代码不可用(或在不同的路径)时,会有一个小错误——现在 lldb 会显示反汇编,但这不是正确的行为这个案例。用户仍在源代码级别操作(使用
s
和 n
进行步进,而不是 si
和 ni
用于指令级步进)并且 lldb 在这种情况下应该不显示任何上下文,只显示源文件名称和行号。
关于xcode - 多个命令为一个的 LLDB 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14637074/