Как определить и использовать переменную пользователя LLDB? - PullRequest
0 голосов
/ 02 октября 2018

Я определяю пользовательскую переменную lldb следующим образом (lldb не сообщает об ошибках):

(lldb) expression -l swift -- let $servicesButton  = unsafeBitCast(0x127979670, to: UIButton.self)

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

(lldb) po $servicesButton  
error: use of undeclared identifier '$servicesButton'  
(lldb) po $servicesButton.isEnabled  
error: use of undeclared identifier '$servicesButton'

Что такоеЯ делаю неправильно?

Кстати: в случае, если это имеет значение, я вломился в отладчик, нажав кнопку «Отладить иерархию представлений».Затем я распечатал описание UIButton и использовал отображаемый адрес памяти в приведенном выше unsafeBitCast.

Обновление: я использую Xcode 10. Вот еще одна серия команд lldb, иллюстрирующих мою проблему:

(lldb) expression var $temp = 5
error: unknown type name 'var'
(lldb) expression -l swift -- var $temp = 5
(lldb) po $temp
error: use of undeclared identifier '$temp'
(lldb) expression int $xxx = 5
(lldb) po $xxx
5

Обновление 2: мне кажется, что-то происходит:

(lldb)  settings set target.language swift
(lldb) expression let $yyy = 88
(lldb) po $yyy
88

Обновление 3: Наконец-то!Установка целевого языка делает свое дело.Я не знаю, почему моего использования опции "-l swift" было недостаточно, но я счастлив, что уже в пути.

(lldb) settings set target.language swift
(lldb) expression
Enter expressions, then terminate with an empty line to evaluate:
1 import UIKit
2 let $button = unsafeBitCast(0x105a23e10, to: UIButton.self)
3 
(lldb) po $button
<UIButton: 0x105a23e10; frame = (134.5 3; 74 29); clipsToBounds = YES; opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x101b7b180>>

(lldb) po $button.isEnabled
false

(lldb) 

1 Ответ

0 голосов
/ 02 октября 2018

Команда «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 ...

...