objective-c lldb

objective c - ¿Por qué LLDB no puede imprimir view.bounds?



lldb inspect variables (8)

A partir de Xcode 6.3, tenemos una mejor solución. En resumen, debe importar UIKit para LLDB para conocer estos tipos: expr @import UIKit . Echa un vistazo a este artículo para aprender algunos trucos para hacer tu vida aún más fácil.

Cosas como esta me vuelven loco cuando se depura:

(lldb) p self.bounds error: unsupported expression with unknown type error: unsupported expression with unknown type error: 2 errors parsing expression (lldb) p (CGRect)self.bounds error: unsupported expression with unknown type error: unsupported expression with unknown type error: C-style cast from ''<unknown type>'' to ''CGRect'' is not allowed error: 3 errors parsing expression (lldb) p [self bounds] error: ''bounds'' has unknown return type; cast the call to its declared return type error: 1 errors parsing expression (lldb) p (CGRect)[self bounds] (CGRect) $1 = origin=(x=0, y=0) size=(width=320, height=238) (lldb) You suck! error: ''You'' is not a valid command. (lldb) …

¿Por qué fallaron los primeros 3 intentos? ¿Hay alguna manera más simple de imprimir self.bounds ? Gracias.


Con Xcode 6.3, podemos importar UIKit y luego imprimir el marco o límite de la vista

expr @import UIKit p self.view.bounds


LLDB no admite la notación de puntos para el envío de mensajes cuando se usa p y es por eso que

p self.bounds

no funciona, pero

p [self bounds]

hace.

(En realidad, lo admite para objetos cuando usas po , sin embargo)

Además, LLDB no tiene información de tipo de objetos no disponibles en el tiempo de ejecución, por lo que debe proporcionar un tipo explícitamente al convertir el valor de retorno.


No sé cuál era el contexto cuando ejecutas esto. Pero parece que lldb no puede encontrar el tipo de self .

Para que lldb evalúe self.bounds , necesita saber que el tipo de self es que algunos Class tienen bounds propiedad. No puede suponer que self es del tipo ObjC porque puede llamarlo en ese contexto:

void test() { struct { int bounds; } self; }

así que obtienes el error de error: unsupported expression with unknown type

Sin embargo, si lo llamas usando [self bounds] , lldb sabe que ese tipo es mucho más del tipo ObjC porque la sintaxis [] solo se aplica al tipo ObjC. Pero dado que el tipo de self no está claro, todavía no puede evaluar el resultado de [self bounds] CGRect [self bounds] por lo que debe CGRect a CGRect


Probé la respuesta de @an0 expr @import UIKit , pero no funcionó.

Luego agregué un archivo pch y agregué estas líneas de código en el archivo:

#ifndef PrefixHeader_pch #define PrefixHeader_pch #ifdef __OBJC__ #import <UIKit/UIKit.h> #endif #endif /* PrefixHeader_pch */

A continuación, vincule el archivo pch a mi proyecto:

Ejecuta la aplicación nuevamente, luego puedo usar la notación de puntos en la consola lldb:

(lldb) po self.view.bounds

Para saber cómo agregar un archivo pch, consulte la respuesta aquí Archivo PCH en Xcode 6


Prueba con la siguiente expresión

p self.view.bounds.size.width

o usar,

po self.view

p - Imprimir solo se usa para imprimir valores normales / simples mientras que po - Print Object funciona igual que NSLog para imprimir el valor de un objeto


Puedes acceder a ella por

p (CGRect)[view bounds]

o

p view.layer.bounds

view.bounds es en realidad view.layer.bounds

Parece que el tipo de información de [UIView bounds] no está disponible para lldb


Te encantará Xcode 6.3+

TLDR

(lldb) e @import UIKit (lldb) po self.view.bounds

El analizador de expresiones Objective-C de LLDB ahora puede importar módulos. Cualquier expresión posterior puede basarse en prototipos de función y método definidos en el módulo:

(lldb) p @import Foundation (lldb) p NSPointFromString(@"{10.0, 20.0}"); (NSPoint) $1 = (x = 10, y = 20)

Antes de Xcode 6.3, los métodos y funciones sin información de depuración requerían typecasts explícitos para especificar su tipo de devolución. La importación de módulos permite que un desarrollador evite el proceso más laborioso de determinar y especificar esta información manualmente:

(lldb) p NSPointFromString(@"{10.0, 20.0}"); error: ''NSPointFromString'' has unknown return type; cast the call to its declared return type error: 1 errors parsing expression (lldb) p (NSPoint)NSPointFromString(@"{10.0, 20.0}”); (NSPoint) $0 = (x = 10, y = 20)

Otras ventajas de importar módulos incluyen mejores mensajes de error, acceso a funciones variadas cuando se ejecuta en dispositivos de 64 bits y eliminación de tipos de argumentos inferidos potencialmente incorrectos.

PD : si también confundes p vs po

p == print == expression -- == e -- po == expression -O -- == e -O --

-- es el separador entre command+flag vs inputs

-O indicador es para invocar el método de description objeto