Debugging 在python lldb脚本完成后继续

Debugging 在python lldb脚本完成后继续,debugging,lldb,Debugging,Lldb,在我的pythonldb脚本完成后,是否有更好的方法发出continue命令 def HelloWorld(debugger, command, result, internal_dict): """ HelloWorld function. It will print "Hello World", regardless of where lldb stopped. Auto-Continues after

在我的
pythonldb
脚本完成后,是否有更好的方法发出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
控制台

本页上的答案没有帮助:

旁注:如果我通过
XCode
终端连接,则相同的行为可以在“同步”或“异步”两种模式下运行lldb

在异步模式下,所有执行控制命令(步骤、下一步等)完成,并在被调试方开始执行时将控制返回给lldb

在同步模式下,执行控制命令等待进程停止,然后返回

正确的同步/异步行为由lldb试探性地确定,但也可以使用
SBDebugger.SetAsync
API手动设置

执行Python支持的lldb命令时,lldb将自己设置为同步模式。这通常是您想要的,例如,如果您希望您的命令执行一个步骤、检查某个内容并执行另一个步骤,您不会希望第一个
步骤
命令在流程中的实际步骤完成之前返回,或者您的“检查某个内容”操作会发生得太快

但是,如果希望命令在继续后立即返回控制,而不是等待进程停止,则可以在Python支持的命令中的最后一个
进程.Continue()之前调用
debugger.SetAsync(True)

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

顺便说一句,从你的笔记听起来,你从exe_ctx参数(你在这个版本中忽略了)得到的过程对你不起作用,但可能与其他问题混淆了。如果在执行continue之前设置了async(True),那么继续
exe\u ctx.process
对我来说很好

最后,如果Python命令确实将进程状态从stopped切换到running,则应通过调用以下命令告知lldb:

result.SetStatus(lldb.eReturnStatusSuccessContinuingResult)


如果在断点回调或停止钩子中使用了您的命令,这很重要,lldb将使用结果跟踪断点命令或停止钩子是否强制重新启动目标。

回答非常好。我的python脚本正在运行,它现在自动继续,正如我所期望的那样。感谢您提供有关lldb.eReturnStatusSuccessContinueResult的提示。关于
exe\u ctx
,我仍然需要了解获取
SBFrame
实例的最佳方法。我可以从多个地方看到它。例如
frame=lldb.frame
或作为函数参数传递给我的函数作为
frame=exe\u ctx.frame
。我将继续阅读
exe\ctx。frame
是正确的。您不能使用
GetSelected
API。当进程因多个线程遇到断点而停止时,lldb必须为每个停止的线程运行断点命令。它通过将适当的exe_ctx传递给断点回调中的命令来实现这一点,而不是在运行其命令之前依次选择每个线程。因此,如果在此上下文中使用您的命令,那么
GetSelected
API将不会做正确的事情。并且不要在命令/断点回调等中使用
lldb.frame
。这是Python模块中的一个全局变量,因此确实无法为所有情况可靠地设置。例如,lldb一次可以支持多个目标,因此lldb.frame不能被赋予明确的含义。在您进入脚本解释器时(使用
script
命令),将其设置为“当前选定的”目标->进程->线程->帧树是一种方便。在lldb的Python REPL中使用它非常方便,但这是唯一有意义的上下文。
result.SetStatus(lldb.eReturnStatusSuccessContinuingNoResult)