Вызов StepOut () и EvaluateExpression () в непосредственной последовательности - PullRequest
0 голосов
/ 03 января 2019

Вызов 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 голосов
/ 03 января 2019

lldb SBDebugger может работать как в синхронном, так и в асинхронном режиме.

В асинхронном режиме команды, запускающие отладчика, возвращаются сразу после запуска.Это полезно, если вы планируете контролировать весь сеанс отладки, обрабатывать события самостоятельно и т. Д. Здесь приведен пример этого:

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

В синхронном режиме StepOut не вернетсяпока дебютант не остановится снова.Этот режим более удобен для одноразовых команд, таких как те, которые вы показываете.

Вы можете установить режим для отладчика, используя вызов "SBDebugger.SetAsync", передавая True для асинхронной и False для синхронизации.

...