¿Existe un comando LLDB que pueda convertir una dirección sin procesar 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 sin procesar en un MKPinAnnotationView para poder examinar sus propiedades. es posible?
(lldb)
en mi consola. Pero no funcionó sin eso.expr -l Swift --
..Puede usar la
unsafeBitCast
función de Swift para enviar una dirección a una instancia de objeto:Luego, puede trabajar
$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 .
fuente
(lldb) settings set target.language swift
. Además, en algunos casos (por ejemplo, cuando se sale del módulo de su aplicación mientras se envía a un tipo desde su aplicación), es posible que deba seguir eso con une import MyApp
El formato lldb
expression
parece haber cambiado en Xcode 7.3. Lo siguiente me ayudó a comenzar:fuente
Para las clases personalizadas necesita importar su proyecto
fuente
A partir de Xcode 8 / Swift 3, esto es lo que funcionó para mí. (Esto se basa en la respuesta de @ sfaxon ).
fuente
Gracias a todas las respuestas anteriores, unsafeBitCast también funciona bien con Xcode 8.3.2 / Swift 3 / macOS / Cocoa Application.
Memorizar una dirección de instancia actual
Más tarde, examínelos
Si pasa algo como esto
asegúrese de elegir uno de los marcos de pila del código fuente de Swift en lugar de uno de ensamblador.
Es probable que suceda cuando la aplicación se pausó al hacer clic en un botón Pausa o se detuvo con una excepción. Al elegir un marco de pila en consecuencia, deje que lldb infiera un lenguaje de programación adecuado.
fuente
Versión Objective-C
fuente
Debug View Hierarchy
vista, hice clic derecho en una vista y luego la seleccionéPrint description of...
. Eso me dio una dirección de memoria y un tipo que podría colocar en el código anterior. Es bueno saber que el depurador visual coloca la consola en un marco Obj-C.Me tomó más tiempo darme cuenta de lo que me gustaría admitir. Es similar a la respuesta de @afinlayson, pero con una mejor explicación (¡espero!) Y una sintaxis fija
Si desea verificar las propiedades de un objeto utilizando el depurador de jerarquía de vistas de Xcode, esto funcionará: está en el contexto objc de forma predeterminada, por lo que tendrá que cambiarlo al contexto Swift
expr -l Swift -- import <YOUR PROJECT NAME>
expr -l Swift -- let $vc = unsafeBitCast(0x7fb7c51cb270, to: <YOUR PROJECT NAME>.<YOUR CUSTOM CLASS NAME>.self)
expr -l Swift -- print($vc.<PROPERTY NAME>)
Ejemplo:
expr -l Swift -- import Football
expr -l Swift -- let $vc = unsafeBitCast(0x7fb7c51cb270, to: Football.Ball.self)
expr -l Swift -- print($vc.velocity)
fuente
La respuesta de @Xi Chen funciona perfectamente cuando su sesión LLDB se inició en un contexto Swift. Sin embargo, en algunos casos, es posible que se haya detenido en un punto de interrupción fuera de un contexto Swift; por ejemplo, cuando es un punto de interrupción simbólico para la API de Objective-C, o cuando está en modo de jerarquía de vista de depuración (al menos a partir de Xcode 11.4).
En ese caso, deberá hacerlo de la manera anterior usando Objective-C:
y ahora puede usarlo
$pin
como lo haría.fuente
po
es un alias, lo que significa que se puede anular. Puede anularpo
manejando direcciones hexadecimales usando objc:Para ver qué efecto tiene esto, puede decirle a lldb que expanda estos alias:
También he creado https://github.com/kastiglione/swift_po , que es un sustituto
po
de Swift. Maneja direcciones de objetos y también tiene algunas otras mejoras.fuente
expression -l objc -O -- 0x76543210
es solo la respuesta para mí, ¡y no necesita saber la clase de variable de la dirección!La forma más fácil, rápida 4
fuente