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
旁注:如果我通过 XCode
或 Terminal
.
附加,则行为相同
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 使用结果来跟踪断点命令或停止挂钩是否强行重启了目标。
在我的 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
旁注:如果我通过 XCode
或 Terminal
.
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 使用结果来跟踪断点命令或停止挂钩是否强行重启了目标。