多个命令为一个的 LLDB 别名

Posted

技术标签:

【中文标题】多个命令为一个的 LLDB 别名【英文标题】:LLDB alias for multiple commands as one 【发布时间】:2013-01-16 05:18:05 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

否则,正如@JasonMolenda 解释的那样,更通用的方法是编写一个 Python 函数,这很简单,可以让您充分利用 LLDB 的强大 Python 支持。尽管如此,有时能够定义内联和单行甚至比 Python 脚本的低标准都好。


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

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

但我不相信同样的工具也适用于定义新命令,除非我可以更正。

【讨论】:

【参考方案2】:

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

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

(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 在这种情况下不应显示任何上下文,仅显示源文件名称和行号。

【讨论】:

好的,问题出在机器上的 lldbinit 文件正在调试中。真的很喜欢LLDB。感谢您的帮助。

以上是关于多个命令为一个的 LLDB 别名的主要内容,如果未能解决你的问题,请参考以下文章

bash 别名中的多个命令

如何(是否可能)创建运行多个命令的hg命令别名?

bash中的别名的多个命令,当第一个是ssh时

Linux之alias命令

linux下一个网卡配置多个ip虚拟ip

虚拟IP---Linux下一个网卡配置多个IP