swift - programming - po en LLDB con rapidez
swift reference (4)
Ese error parece ser porque DWARF no le está diciendo a LLDB dónde encontrar su objeto "propio". Dada la naturaleza de Swift, LLDB necesita saber el tipo de identidad para poder insertar una expresión dentro de su ámbito local. Una forma de averiguar si ese es su problema es hacerlo en el indicador LLDB:
(lldb) frame variable -L self
Probablemente no veas una ubicación para ello. Merece la pena presentar un informe de error, solo para seguir su caso específico de reprografía
De todos modos, para llegar a la mayor parte de su pregunta. En Swift, no existe un mecanismo sancionado por el lenguaje para "imprimir descripción" como para ObjC, así que mientras puedes escribir "po self", a menos que self sea un tipo Objective-C, verás casi lo mismo que "p self" "o incluso" auto variable de marco "le diría, que está completamente basado en el mecanismo de formateadores de datos LLDB. Si desea enganchar eso para personalizar la apariencia de sus objetos Swift, la referencia obligatoria es: http://lldb.llvm.org/varformats.html
¿Cómo puedo trazar el valor de la variable en una aplicación Swift con LLDB?
Anteriormente era como po variable_name
Ahora, por lo general, recibo un error desagradable, como:
(lldb) po a
error: <EXPR>:11:5: error: use of unresolved identifier ''$__lldb_injected_self''
$__lldb_injected_self.$__lldb_wrapped_expr_2(
^
Hice algunas pruebas para descubrir cómo funciona con Swift, los resultados me sorprendieron un poco. Con objetos ObjC, po
llama a debugDescription
que llama por defecto description
. Eso esta limpio. Lamentablemente, no se aplica lo mismo al trabajar con clases de Swift. Me centré en los objetos en lugar de en la impresión de variables individuales.
Para hacerlo funcionar (comando po
en lldb
) tuve que anular la descripción. Debajo del código que utilicé para probar:
class Test : NSObject
{
var name : String?
var surname : String?
override var debugDescription : String{
return "debugDescription method"
}
override var description : String {
return "description Method"
}
}
Pruebas:
let test = Test()
test.name = "name"
test.surname = "surname"
(lldb) po test
description Method
(lldb) p test
(DebugTest.Test) $R1 = 0x00007fce11404860 {
ObjectiveC.NSObject = {
isa = DebugTest.Test
}
name = "name"
surname = "surname"
}
(lldb) po dump(test)
▿ DebugTest.Test #0
- super: debugDescription method
▿ name: name
- Some: name
▿ surname: surname
- Some: surname
description Method
(lldb) po print(test)
description Method
Lo que me sorprendió es que po
en objetos Swift llama a description
lugar de debugDescription
que difiere de ObjC.
EDITAR
Para hacer que actúe como con ObjC, Tu clase tiene que implementar CustomDebugStringConvertible y luego po
llamará a debugDescription
, que por defecto llama a description
. Lo único que debe cambiarse en mi ejemplo sería agregar:
class Test : NSObject, CustomDebugStringConvertible
Comprobado con XCode 7.0.1
y iOS SDK 9
, Swift 2.0
Para asegurarte de que estás en el contexto de idioma correcto para lldb set:
(lldb) settings set target.language swift
Con esta clase de ejemplo:
class lyftClass {
let mickey: String
let mouse: Int
init(mickey: String, mouse: Int) {
self.mickey = mickey
self.mouse = mouse
}
}
Utilizo la expresión de lldb, que está detrás del comando po, para crear una instancia de la clase e imprimir las variables de instancia de la clase:
(lldb) expression let $b = lyftClass(mickey: "zer", mouse: 500)
(lldb) po $b
<lyftClass: 0x60c000284470>
(lldb) po $b.mickey
"zer"
(lldb) po $b.mouse
500
Puedo confirmar el mismo error, para Xcode beta4, y frame variable -L self
muestra algo, pero parece peor:
: (SwiftCollectionViewSample.DetailViewController) self =
Definitivamente archivaré un error, Enrico
17819707 el depurador imprime el error: uso del identificador no resuelto ''$ __ lldb_injected_self''