Команда «expression» выбирает язык для использования из языка текущего выбранного фрейма.Если вы просто прервете программу для запуска отладчика представления, скорее всего, текущий кадр будет C, ObjC или C ++, поэтому вам нужно было установить флаг -l в swift.Вы выяснили, что одним хитрым взаимодействием было:
(lldb) expression -l swift -- var $temp = 5
(lldb) po $temp
error: use of undeclared identifier '$temp'
. Для этого вы должны помнить, что "po" на самом деле является псевдонимом для:
(lldb) expr -O -- <EXPRESSION>
, где флаг -Oозначает «напечатать описание объекта результата предоставленного выражения».Если вы сделаете help po
, это скажет вам об этом внизу текста справки.
Таким образом, po сначала берет предоставленное вами выражение, запускает его, используя текущий язык (вы видите, куда это идет ...), а затем выбирает метод описания объекта для конкретного языка (например, в Swift, запустив Mirror для объекта) и распечатывает его.Вы правильно сделали $ temp в качестве быстрой переменной, но вы попытались получить описание объекта переменной C с именем $ temp, которой не было.
Если вы хотите использовать «po» в любом фрейме и применить его к быстрым объектам, вам нужно либо принудительно настроить язык по умолчанию (что вы использовали для команды settings set
), либо вам нужнодля запуска:
(lldb) expr -O -l swift -
Обратите внимание, что вы не можете сделать:
(lldb) po -l swift
, поскольку псевдоним po
оканчивается на --
, который является маркером, который вы завершили, предоставляя опции, а весь остальной текст команды является выражением.Это сделано для того, чтобы:
(lldb) po -5
не смущал вас, говоря, что нет опции с именем 5
...