LLDB (Swift): Casting Raw Address into Usable Type


¿Hay un comando LLDB que pueda convertir una dirección raw en una clase Swift utilizable?

Por ejemplo:

(lldb) po 0x7df67c50 as MKPinAnnotationView

Sé que esta dirección apunta a un MKPinAnnotationView, pero no está en un marco que pueda seleccionar. Pero, quiero convertir la dirección raw en un MKPinAnnotationView para que pueda examinar sus propiedades. Es esto posible?

Author: jarrodparkes, 2015-04-04

8 answers

En xCode 8.2.1 y Swift 3, el comando lldb po o p no funciona con el tipo de variable. Tendrá que utilizar el comando swift imprimir para examinar las propiedades de la instancia del objeto escrito. (Gracias a respuesta de cbowns !) Por ejemplo:

(lldb) expr -l Swift -- import UIKit
(lldb) expr -l Swift -- let $pin = unsafeBitCast(0x7df67c50, to: MKPinAnnotationView.self)
(lldb) expr -l Swift -- print($pin.alpha)
 67
Author: Xi Chen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:15

Puede usar la función unsafeBitCast de Swift para enviar una dirección a una instancia de objeto:

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

Entonces puede trabajar con $pin como de costumbre – propiedades de acceso, métodos de llamada, etc.

Consulte este artículo para obtener más información: Swift Memory Dumping.

 36
Author: gregheo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-04 04:13:34

El formato lldb para expression parece haber cambiado en XCode 7.3. Lo siguiente me puso en marcha:

(lldb) expr -l Swift -- import UIKit
(lldb) expr -l Swift -- let $view = unsafeBitCast(0x7fb75d8349c0, UIView.self)
 20
Author: sfaxon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-18 16:55:25

A partir de Xcode 8 / Swift 3, esto es lo que funcionó para mí. (Esto se basa en la respuesta de@sfaxon.)

(lldb) expr -l Swift -- import UIKit
(lldb) expr -l Swift -- let $nav = unsafeBitCast(0x1030ff000, to: UINavigationController.self)
 9
Author: cbowns,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:36

Para las Clases personalizadas necesitas importar tu proyecto

expr -l Swift -- import MyTestProject
expr -l Swift --  let $vc = unsafeBitCast(0x7fad22c066d0, ViewController.self)
expr -l Swift -- print($vc.view)
 7
Author: afinlayson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-10 19:17:13

Gracias a todas las respuestas anteriores, unsafeBitCast también funciona bien con la aplicación Xcode 8.3.2 / Swift 3 / macOS / Cocoa.

Memorizar una dirección de la instancia actual

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

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

Más tarde, examinarlos

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

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

Si algo como esto sucede

(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'

Asegúrese de elegir uno de los marcos de pila del código fuente Swift en lugar de uno ensamblador.

Es probable que suceda cuando la aplicación se detuvo haciendo clic en un Pausa botón o detenido con una excepción. Al elegir un marco de pila en consecuencia, dejar lldb infiera un lenguaje de programación adecuado.

 5
Author: Tora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-04 09:07:48

Versión de Objective-C

po ((MKPinAnnotationView *)0x7df67c50).alpha
 0
Author: rockhard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-15 12:25:38

La forma más fácil, swift 4

expr unsafeBitCast(0x7df67c50, to: MKPinAnnotationView.self)
 0
Author: Kingsley Mitchell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-06 02:13:49