2015-04-04 11 views
33

Czy istnieje polecenie LLDB, które może rzutować nieprzetworzony adres na użyteczną klasę Swift?LLDB (Swift): przesyłanie adresu nieprzetworzonego do użytecznego typu

Na przykład:

(lldb) po 0x7df67c50 as MKPinAnnotationView 

wiem, że ten adres wskazuje na MKPinAnnotationView, ale nie jest w ramce, że mogę wybrać. Ale chcę rzucić surowy adres do MKPinAnnotationView, aby móc zbadać jego właściwości. czy to możliwe?

Odpowiedz

34

W Xcode 8.2.1 Swift 3 polecenia lldb PO lub P nie będzie działać z zmiennej maszynowo. Aby sprawdzić właściwości wpisywanej instancji obiektu, należy użyć polecenia swift: wydrukować. (Dzięki cbowns's answer!) Np .:

(lldb) expr -l Swift -- import UIKit 
(lldb) expr -l Swift -- let $pin = unsafeBitCast(0x7df67c50, to: MKPinAnnotationView.self) 
(lldb) expr -l Swift -- print($pin.alpha) 
+2

To naprawdę nie powinno być tak trudno –

+0

To był trochę sprzeczny intuicyjny. Myślałem, że nie muszę wpisywać '(lldb)' w mojej konsoli. Ale bez tego nie działało. – Honey

30

Można użyć unsafeBitCast funkcję Swift rzucić adresu do instancji obiektu:

(lldb) e let $pin = unsafeBitCast(0x7df67c50, MKPinAnnotationView.self) 
(lldb) po $pin 

Następnie można pracować z $pin jak zwykle - właściwości dostępu, metody połączeń, itp

Sprawdź to artykuł, aby uzyskać więcej informacji: Swift Memory Dumping.

+0

Do pierwszego oświadczenia Chyba zapomniał „expr” lub „wyrażenia”. W przeciwnym razie działa świetnie! – jarrodparkes

+0

Dzięki ... naprawione! – gregheo

+2

Otrzymuję "błąd: użycie niezadeklarowanego identyfikatora" unsafeBitCast "" w Xcode 7.2. – devios1

17

Wygląda na to, że format lldb dla expression został zmieniony w XCode 7.3. Zacząłem od tego:

(lldb) expr -l Swift -- import UIKit 
(lldb) expr -l Swift -- let $view = unsafeBitCast(0x7fb75d8349c0, UIView.self) 
7

Od Xcode 8/Swift 3, oto, co zadziałało dla mnie. (Ta opiera się @sfaxon's answer.)

(lldb) expr -l Swift -- import UIKit 
(lldb) expr -l Swift -- let $nav = unsafeBitCast(0x1030ff000, to: UINavigationController.self) 
2

Dzięki wszystkich powyższych odpowiedzi, unsafeBitCast działa też dobrze z Xcode 8.3.2 Application/Swift 3/MacOS/kakao.

zapamiętać adresu bieżącej instancji

(lldb) p tabView.controlTint 
(NSControlTint) $R10 = defaultControlTint 

(lldb) p self 
(LearningStoryboard.NSTabViewController) $R11 = 0x00006080000e2280 { 
..... 

Później, badać je

(lldb) p unsafeBitCast(0x00006080000e2280, to: NSTabViewController.self).tabView.controlTint 
(NSControlTint) $R20 = graphiteControlTint 

(lldb) p $R11.tabView.controlTint 
(NSControlTint) $R21 = graphiteControlTint 

Jeśli coś takiego się dzieje

(lldb) p unsafeBitCast(0x00006080000e2280, to: NSTabViewController.self).tabView.controlTint 
error: use of undeclared identifier 'to' 

(lldb) p $R11.tabView.controlTint 
error: use of undeclared identifier '$R11' 

upewnij się, że wybrać jedną z klatek stos Swift to kod źródłowy, a nie asemblerowy.

To może się zdarzyć, gdy aplikacja została wstrzymana przez kliknięcie Pauza przycisk lub zatrzymana wyjątek. Wybierając odpowiednio ramkę stosu, pozwól, aby lldb uzyskał prawidłowy język programowania.

4

Dla niestandardowych klas trzeba zaimportować projektowi

expr -l Swift -- import MyTestProject 
expr -l Swift -- let $vc = unsafeBitCast(0x7fad22c066d0, ViewController.self) 
expr -l Swift -- print($vc.view) 
Powiązane problemy