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?
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)
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.
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)
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)
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)
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.
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
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)
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