Des choses comme ça me rendent fou lors du débogage:
(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) …
Pourquoi les 3 premières tentatives ont-elles échoué? Existe-t-il un moyen plus simple d'imprimer self.bounds
? Merci.
À partir de Xcode 6.3, nous avons une meilleure solution. En bref, vous devez importer UIKit pour LLDB pour connaître ces types: expr @import UIKit
. Consultez cet article pour apprendre quelques astuces pour vous faciliter la vie encore plus.
Vous pouvez y accéder par
p (CGRect)[view bounds]
ou
p view.layer.bounds
view.bounds
est en fait view.layer.bounds
Il semble que les informations de type de [UIView bounds]
n'est pas disponible pour lldb
Tu vas aimer Xcode 6.3 +
[~ # ~] tldr [~ # ~]
(lldb) e @import UIKit
(lldb) po self.view.bounds
L'analyseur d'expression Objective-C de LLDB peut désormais importer des modules. Toute expression ultérieure peut s'appuyer sur des prototypes de fonction et de méthode définis dans le module:
(lldb) p @import Foundation
(lldb) p NSPointFromString(@"{10.0, 20.0}");
(NSPoint) $1 = (x = 10, y = 20)
Avant Xcode 6.3, les méthodes et fonctions sans informations de débogage nécessitaient des transcriptions explicites pour spécifier leur type de retour. L'importation de modules permet à un développeur d'éviter le processus plus laborieux de détermination et de spécification manuelle de ces informations:
(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)
D'autres avantages de l'importation de modules incluent de meilleurs messages d'erreur, l'accès aux fonctions variadiques lors de l'exécution sur des appareils 64 bits et l'élimination des types d'arguments inférés potentiellement incorrects.
[~ # ~] ps [~ # ~] : Si vous confondez également p vs po
p == print == expression -- == e --
po == expression -O -- == e -O --
--
est le séparateur entre command+flag
vs inputs
-O
L'indicateur sert à appeler la méthode objet description
Avec Xcode 6.3, nous pouvons importer UIKit puis imprimer le cadre ou le cadre de vue
expr @import UIKit
p self.view.bounds
LLDB ne prend pas en charge la notation par points pour l'envoi de messages lors de l'utilisation de p
et c'est pourquoi
p self.bounds
ne fonctionne pas, mais
p [self bounds]
est-ce que.
(Cependant, il le prend en charge pour les objets lorsque vous utilisez po
)
En outre, LLDB n'a pas d'informations de type de non-objets disponibles au moment de l'exécution, vous devez donc fournir explicitement un type en convertissant la valeur de retour.
Je ne sais pas quel était le contexte lorsque vous avez exécuté cela. Mais il semble que lldb ne trouve pas le type de self
.
Pour que lldb évalue self.bounds
, Il doit connaître le type de self
si une classe a la propriété bounds
. Il ne peut pas supposer que self
est de type ObjC car vous pouvez l'appeler dans un tel contexte:
void test()
{
struct
{
int bounds;
} self;
}
vous obtenez donc l'erreur error: unsupported expression with unknown type
Cependant, si vous l'appelez en utilisant [self bounds]
, Lldb sait que self
doit être de type ObjC car la syntaxe []
Ne s'applique qu'au type ObjC. Mais comme le type de self
n'est pas clair, il ne peut toujours pas évaluer le résultat de [self bounds]
, Vous devez donc le convertir en CGRect
Essayez avec l'expression suivante,
p self.view.bounds.size.width
ou utiliser,
po self.view
p - Imprimer n'est utilisé que pour imprimer des valeurs normales/simples tandis que po - Imprimer objet fonctionne de la même manière que NSLog pour imprimer la valeur d'un objet
J'ai essayé la réponse de @ an0 expr @import UIKit
, Mais cela n'a pas fonctionné.
J'ai ensuite ajouté un fichier pch et ajouté ces lignes de code dans le fichier:
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#endif
#endif /* PrefixHeader_pch */
Ensuite, liez le fichier pch à mon projet:
Exécutez à nouveau l'application, puis je peux utiliser la notation par points dans la console lldb:
(lldb) po self.view.bounds
Pour savoir comment ajouter un fichier pch, voir la réponse ici Fichier PCH dans Xcode 6