Есть ли разница между `po $ arg1` и` bt` в команде отладчика точек останова? - PullRequest
0 голосов
/ 23 января 2019

Мне интересно, есть ли разница между тем, что вы получаете в отладчике, когда вы устанавливаете для команды отладчика точки останова исключение:

po $ arg1

vs

bt

Если да, то можете ли вы объяснить мне, каковы эти различия, и, возможно, какое из них более выгодно (и если выгода является ситуативной, в какой ситуации?(ы))?

Я видел оба предложенных в уроках, но я не уверен, какой из них лучше.Спасибо.

1 Ответ

0 голосов
/ 29 января 2019

bt - немного необычный ярлык lldb для thread backtrace.bt покажет вам последовательность вызовов, которые привели вас к точке останова.Если какая-либо из вызывающих функций в стеке имеет отладочную информацию, lldb также выведет аргументы функции.Это наиболее полезная вещь, которую нужно делать при достижении точки останова, поскольку она отвечает на более общий вопрос «где я».

po $arg1 - это гораздо более специализированная вещь.

$arg1 - это сокращение от lldb для регистра, используемого для передачи первого аргумента функции.Если вы используете первую инструкцию функции, то этот регистр будет содержать значение, переданное при вызове функции.Однако обратите внимание, что $arg1 на самом деле является просто именем регистра, поэтому, если этот регистр используется повторно - например, когда функция, в которой вы остановлены, вызывает другую функцию, значение входящего аргумента будет перезаписано.Таким образом, $arg1 означает «первый аргумент» только в том случае, если вы остановлены в самом начале функции.

po - сокращение от expr -O --.Он оценивает переданное ему выражение, а затем, если результатом является объект ObjC или Swift, вызывает в среду выполнения для получения пользовательского описания объекта и печатает его.В противном случае он печатает значение.

Так po $arg1 печатает описание объекта для первого аргумента функции, если вы остановились в начале функции.Чаще всего это используется для того, чтобы все методы ObjC принимали параметр self в качестве первого аргумента.Поэтому, если вы остановитесь в начале метода, po $arg1 выведет описание объекта параметра self.

...