11

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

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

4

2 回答 2

3

是的,正确的方法是通过 Python 脚本接口。有一个深思熟虑的决定来避免 gdb 在调试器的命令语言中塞满足够的流控制和执行逻辑以使这成为可能(或者更确切地说 - 使其成为可能......糟糕)。与这种方法不同,您需要使用 Python 来完成任务的门槛很低——但调试器的全部功能可以通过 Python 中一些非常易于使用的接口获得。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 会向您显示反汇编,但这不是正确的行为这个案例。用户仍在源代码级别操作(使用sand nto step,而不是siforni指令级步进)并且 lldb 在这种情况下不应该显示任何上下文,只显示源文件名和行号。

于 2013-02-01T05:40:36.840 回答
0

如果您只想创建一个结合一两个基本命令的超级简单别名,我发现以下作为单行命令几乎是合理的

command alias ff script lldb.debugger.HandleCommand('frame info'); lldb.debugger.HandleCommand('disassemble')

这有点麻烦,并且并非在所有情况下都有效,但它至少可以让您就地组合几个命令,而无需创建上下文并将其切换到单独的文件。

否则,正如@JasonMolenda 解释的那样,更通用的方法是编写一个 Python 函数,这很简单,可以让您充分利用 LLDB 的强大 Python 支持。尽管如此,有时能够定义 in-line 和 one-liner 胜过 Python 脚本的低标准仍然是件好事。


顺便说一句,LLDB 确实支持就地定义 LLDB 命令列表,例如在断点处执行

> breakpoint command add 1    # Execute the following on breakpoint 1
p x
p y
p z
DONE

but I don't believe the same facility applies to defining new commands unless I can be corrected.

于 2021-09-23T17:40:39.420 回答