Отключить состояние восстановления LLDB всякий раз, когда происходит сбой функции, вызываемой в отладчике - PullRequest
0 голосов
/ 06 мая 2020

Я отлаживаю проект C с помощью отладчика LLDB.

Я подключаю отладчик к программе, а затем вызываю некоторые функции в отладчике, которые, как ожидается, сработают sh. Я хотел знать, где происходит сбой этой функции.

Проблема в том, что поскольку функция вызывается из отладчика, после сбоя функции отладчик сбрасывает состояние обратно в состояние перед вызовом функции. Я не хочу этого, не знаю, как это отключить?

Это сообщение, которое я получаю от отладчика lldb

lldb output]

Спасибо

1 Ответ

2 голосов
/ 07 мая 2020

Вы можете получить 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.

...