python-lldb 脚本完成后继续

Continue after python-lldb script has finished

在我的 python-lldb 脚本完成后,是否有更好的方法来发出 continue 命令?

def HelloWorld(debugger, command, result, internal_dict):
    """
        HelloWorld function. It will print "Hello World", regardless of where lldb stopped.
        Auto-Continues after script has ran.
    """
    target = debugger.GetSelectedTarget()
    process = target.GetProcess()
    print("[*] Hello World from :{}".format(process))
    process.Continue()

该示例将控制权交还给应用程序,但我不再拥有交互式 lldb 控制台。

此页面上的答案没有帮助: LLDB: silently continue after python script is done executing

旁注:如果我通过 XCodeTerminal.

附加,则行为相同

lldb 可以 运行 两种模式“同步”或“异步”。

在异步模式下,所有执行控制命令(step、next 等)一旦被调试者开始执行就完成并return控制到 lldb。

在同步模式下,执行控制命令在 returning 之前等待进程停止。

正确的 sync/async 行为由 lldb 启发式计算,但也可以使用 SBDebugger.SetAsync API.

手动设置

执行 Python 支持的 lldb 命令时,lldb 将自身设置为同步模式。这通常是你想要的,例如,如果你想让你的命令执行一个步骤,检查一些东西然后再执行另一个步骤,你不希望第一个 step 命令到 return 在过程中的实际步骤之前已完成,否则您的“检查某物”操作会过早发生。

但是,如果您希望您的命令在继续后立即 return 控制,而不是等待进程停止,那么您可以在最终 process.Continue() 之前调用 debugger.SetAsync(True)您的 Python 支持的命令。

请注意,这个故事还有一个复杂之处。当 lldb 启动一个进程时,默认行为是与被调试者共享终端。因此,当进程处于 运行ning 时,它将拥有终端,并且在进程停止之前,您不会看到 lldb 提示(这会覆盖进程输出)或无法输入命令。如果你想让调试器在进程 运行ning 时运行并接受命令,你需要给 lldb 和应用程序单独的终端。在 lldb 中,使用 process launch --tty,在 Xcode 中,运行 方案的选项选项卡中有一组单选按钮,可让您选择单独的终端而不是使用 Xcode控制台。

顺便说一句,从你的笔记听起来好像你从 exe_ctx 参数(你在这个版本中遗漏了)中得到的过程对你不起作用?,但也许这与其他混淆了问题。如果我在继续之前设置异步(真),那么继续 exe_ctx.process 对我来说很好。

最后,如果您的 Python 命令确实将进程状态从停止切换到 运行ning,您应该通过调用以下方式告诉 lldb:

result.SetStatus(lldb.eReturnStatusSuccessContinuingResult)

result.SetStatus(lldb.eReturnStatusSuccessContinuingNoResult)

如果您的命令被用于断点回调或 stop-hook,这很重要,其中 lldb 使用结果来跟踪断点命令或停止挂钩是否强行重启了目标。