【问题标题】:How to write an lldb script to launch the process to be debugged如何编写 lldb 脚本来启动要调试的进程
【发布时间】:2021-09-12 19:33:38
【问题描述】:

我有一些简单的 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,然后在脚本返回后必须在 llvm 中继续。这很接近,但是需要输入两个命令有点烦人。

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

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

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

【问题讨论】:

    标签: python debugging lldb


    【解决方案1】:

    当我们运行 Python 解释器时,这是 lldb 的 SIGINT 处理程序与 Python 的一个处理程序。 lldb 必须做一些更聪明的事情来确定要分派到哪个处理程序。

    幸运的是,有一个解决方法是确保您的命令只是启动目标运行,然后将命令返回到 lldb 命令解释器。这样做的方法是确保调试器在运行命令的“异步模式”下运行执行控制命令。您不想永久这样做:

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

    【讨论】:

    • 这是有道理的,而且似乎有效。谢谢!
    猜你喜欢
    • 2010-10-16
    • 2013-09-08
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2014-08-10
    • 2015-08-03
    相关资源
    最近更新 更多