如何编写 lldb 脚本来启动要调试的进程

How to write an lldb script to launch the process to be debugged

我有一些简单的 gdb 定义,我想在 lldb 中实现。我使用了一个小的包装脚本,它实际上生成了 gdb 定义,然后在我启动 gdb 时加载它们。最简单的就是

define rm
run $LIBLIST $KEXTRAS $EXTRAS
end

它只是定义了一个自定义 rm 命令,该命令 运行 将二进制文件与包装脚本中确定的命令行参数一起使用。

我想在 lldb 中模拟它。我试过编写 python 脚本,我可以让它们加载 运行,但似乎命令是 运行 在 python 解释器下,以便调试器未捕获事件(如 CTRL-C 中断调试器)。

这是我目前得到的:

import os
import lldb
def __lldb_init_module(debugger, dict):
    debugger.HandleCommand('command script add -f $PYPKG.rm_command rm')

def rm_command( debugger, command, result, internal_dict):
    debugger.HandleCommand( 'run $LIBLIST $KEXTRAS $EXTRAS' )

我也尝试过使用 debugger.GetSelectedTarget().Launch,但我得到的结果几乎相同。我得到的最接近的是指定 lldb.eLaunchFlagStopAtEntry LaunchFlag,然后必须在脚本 returns 之后在 llvm 中继续。差不多了,但是需要输入两个命令有点烦人。

如何从 lldb 脚本启动一个进程,以便它可以像在 lldb 本身中使用 运行 命令一样进行调试?

(对于这个例子,我知道我可以在 lldb 的命令行上传递命令行参数,但更复杂的例子将脚本中的参数与我想在调试时指定的值结合起来)

(我也知道你可以为像这样的一个班轮创建一个别名,但我有一些更复杂的脚本不可能作为别名)

这是 lldb 的 SIGINT 处理程序与 Python 的战斗,而我们 运行 使用 Python 解释器。 lldb 将不得不做一些更聪明的事情来确定要分派给哪个处理程序。

幸运的是,有一种解决方法是确保您的命令只启动目标 运行ning,然后 returns 命令到 lldb 命令解释器。这样做的方法是确保调试器 运行ning 在“异步模式”中为 运行 命令执行控制命令。你不想永久地做这样的事情:

def runcmd(debugger, command, result, internal_dict):
     old_val = debugger.GetAsync() 
     debugger.SetAsync(True) 
     debugger.HandleCommand("run") 
     debugger.SetAsync(old_val)