立即调用StepOut()
,然后立即调用EvaluateExpression()
,例如从脚本中调用,不会返回期望值。
当手动从控制台分别调用以下功能时,它确实起作用:
(lldb) script lldb.thread.StepOut()
(lldb) script print lldb.frame.EvaluateExpression("$rax").description
但是,将它们合并为一个语句时,它不起作用:
(lldb) script lldb.thread.StepOut(); print lldb.frame.EvaluateExpression("$rax").description
这会将None
打印到控制台。
检查流程状态表明两种形式之间存在差异:
(lldb) script lldb.thread.StepOut()
(lldb) script print lldb.process.state
状态值为lldb.eStateStopped
。
按顺序运行时,StepOut
之后的状态不同:
(lldb) script lldb.thread.StepOut(); print lldb.process.state
这里的状态为lldb.eStateRunning
。
所以问题是:
应如何编写代码以确保StepOut
已完全完成?我假设这要求在调用frame
之前,状态必须回到停止状态,并且要初始化/设置EvaluateExpression()
?
答案 0 :(得分:1)
lldb SBDebugger可以在同步或异步模式下运行。
在异步模式下,导致被调试者运行的命令在其开始运行后立即返回。如果您打算控制整个调试会话,自己处理事件等,这将非常有用。这里有一个示例:
http://llvm.org/svn/llvm-project/lldb/trunk/examples/python/process_events.py
在同步模式下,直到被调试者再次停止后,StepOut才会返回。该模式对于一次性命令(如您显示的命令)更方便。
您可以使用“ SBDebugger.SetAsync”调用在被调试者上设置模式,传递True表示异步,传递False表示同步。