Вы можете получить lldb для сохранения состояния потока при сбое выражения двумя способами.
1) Если вы хотите ВСЕГДА останавливаться в аварийном состоянии, когда выражения cra sh, установите для параметра target.process.unwind-on-error-in-expressions
значение false:
settings set target.process.unwind-on-error-in-expressions false
либо в командной строке, либо в ваш ~\.lldbinit
файл.
Кстати, по этой причине, если вы используете lldb SB API для написания сценариев или пишете свой собственный отладчик GUI, и вам нужно вызвать функцию для какой-то цели, рекомендуется явно переопределить этот параметр при вызове функций. Используйте для этого метод SBExpressionOptions.SetUnwindOnErrors. В противном случае ваши пользователи могут в конечном итоге увидеть cra sh в выражении, которое они не вызывали ...
2) Вы можете сделать это для каждого выражения, используя:
expr -u 0 -- <expression>
Обратите внимание: если вы делаете это часто, вы можете создать для этого псевдоним. Что-то вроде:
command alias pu expr -u 0 --
Тогда просто выполните:
pu <expression>
Остановившись на выражении cra sh, вы можете исследовать стек, локальные переменные, вызывать другие выражения и т. Д. c так же, как при обычной остановке в lldb. Когда вы закончите это расследование и захотите вернуть поток в состояние, в котором он находился до вызова выражения, используйте команду:
thread return -x
Вызов выражений для вложений потоков; вы можете вызвать выражение, остановить его, когда оно выйдет из строя, вызвать другое выражение, которое выйдет из строя, остановиться, когда оно выйдет из строя, et c ... thread return -x
раскрутит самое молодое выражение cra sh.
на соответствующее примечание, вы также можете установить точки останова в функции, которую вы вызываете в синтаксическом анализаторе выражения, нажимаете точку останова и затем выполняете остальную часть оценки выражения. Это также не включено по умолчанию, но управляется флагом -i
на expr
, например:
expr -i 0 -- <expression>
Когда вы закончите изучение кода, который вы вызывали, вы можете использовать thread return -x
чтобы стереть оценку выражения из стека потоков, или вы можете continue
, и выражение завершится sh вычислением и результат будет напечатан.
Этот трюк очень удобен для наблюдения за поведением функций с нечетными входными данными и т.д. c.