web-dev-qa-db-fra.com

Pourquoi LLDB ne peut-il pas imprimer view.bounds?

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.

53
an0

À 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.

41
an0

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

53
youfu

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

13
onmyway133

Avec Xcode 6.3, nous pouvons importer UIKit puis imprimer le cadre ou le cadre de vue

expr @import UIKit
p self.view.bounds
6
Ozgur Sahin

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.

6
Gabriele Petronella

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

0
Bryan Chen

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

0
Bhavik Modi

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:

enter image description here

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

0
wj2061