the programming language docs swift lldb

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

Reference

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