立即调用StepOut()和EvaluateExpression()

时间:2019-01-03 01:25:34

标签: lldb

立即调用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()

1 个答案:

答案 0 :(得分:1)

lldb SBDebugger可以在同步或异步模式下运行。

在异步模式下,导致被调试者运行的命令在其开始运行后立即返回。如果您打算控制整个调试会话,自己处理事件等,这将非常有用。这里有一个示例:

http://llvm.org/svn/llvm-project/lldb/trunk/examples/python/process_events.py

在同步模式下,直到被调试者再次停止后,StepOut才会返回。该模式对于一次性命令(如您显示的命令)更方便。

您可以使用“ SBDebugger.SetAsync”调用在被调试者上设置模式,传递True表示异步,传递False表示同步。