2014-07-16 4 views
33

Comment puis-je tracer la valeur de la variable dans une application Swift avec LLDB?po dans LLDB avec swift

Auparavant, il était comme po variable_name

Maintenant, je reçois habituellement une erreur méchant, comme:

(lldb) po a 
error: <EXPR>:11:5: error: use of unresolved identifier '$__lldb_injected_self' 
    $__lldb_injected_self.$__lldb_wrapped_expr_2(  
    ^
+3

Eh oui, le débogage à Swift est actuellement tributaire de 'println'. – Jack

+0

J'ai eu une erreur de débogueur similaire qui a seulement eu lieu en essayant d'inspecter les constantes 'let'; voir ma question à ce sujet [ici] (http://stackoverflow.com/questions/26189424/how-to-view-value-of-swift-let-constant-in-xcode-6-debugger) -il s'est avéré être un bug dans Xcode 6. –

+0

Il semble y avoir un appel pour les exemples de code/projets qui présentent ces problèmes, de la part de l'équipe du compilateur: https://devforums.apple.com/message/1106278#1106278. Toute contribution à cette cause serait sûrement appréciée par tous (et serait certainement un jolly-good-fellow) –

Répondre

16

Cette erreur semble que cela pourrait être parce que NAIN ne dit pas LLDB où trouver votre « soi » objet. Compte tenu de la nature de Swift, LLDB doit connaître le type de soi afin de pouvoir injecter une expression à l'intérieur de votre portée locale. Une façon de savoir si c'est votre problème est de le faire à l'invite LLDB:

(lldb) variable de cadre -L self

Vous ne verrez probablement pas d'emplacement pour cela. Il vaut la peine de déposer un rapport de bogue pour, juste pour suivre votre cas de repro

Quoi qu'il en soit, pour arriver à l'essentiel de votre question. Dans Swift, il n'y a pas de mécanisme sanctionné par une langue pour la "description imprimée" comme pour ObjC, donc si vous pouvez taper "po self", à moins que self soit un type Objective-C, vous verrez à peu près la même chose "ou même" frame variable self "vous dirait - qui est entièrement basé sur le mécanisme de formateurs de données LLDB. Si vous voulez brancher en cela pour personnaliser la façon dont vos objets Swift regarder, la référence obligatoire est: http://lldb.llvm.org/varformats.html

+4

Il est fâcheux que Xcode 6 final soit publié et qu'ils ne puissent pas implémenter la fonctionnalité de base pour surveiller la valeur d'une variable pendant le débogage. –

+0

@enrico: Quel est l'état actuel de l'art pour obtenir des symboles Swift - est-il attendu que l'on travaille sur des objets rapides et purs? Existe-t-il un moyen différent d'obtenir des données, et existe-t-il des paramètres de construction spéciaux nécessaires pour cela? Merci! –

+0

"variable d'image" n'obtient pas le même résultat que la description d'impression de l'objet. Il imprime des déchets presque inutiles. – poGUIst

1

Je peux confirmer la même erreur, pour Xcode beta4 et auto

variables cadre -L

affiche quelque chose , mais semble le pire:

: (SwiftCollectionViewSample.DetailViewController) auto =

Je définitivement déposé un bug, Enrico

17819707 debugg Erreur d'impression er: utilisation de l'identifiant non résolu '$ __ lldb_injected_self'

+0

J'ai eu la même erreur avec XCode6 beta4 –

1

J'ai fait quelques tests pour comprendre comment cela fonctionne avec Swift, les résultats m'ont un peu surpris. Avec les objets ObjC po appelle debugDescription qui appelle par défaut description. C'est clair. Malheureusement, la même chose ne s'applique pas lorsque vous travaillez avec des classes Swift. Je me suis concentré sur les objets plutôt que sur l'impression de variables uniques.

Pour le faire fonctionner (commande po dans lldb) J'ai dû redéfinir la description. Ci-dessous le code I utilisé pour le test:

class Test : NSObject 
{ 
    var name : String? 
    var surname : String? 

    override var debugDescription : String{ 
     return "debugDescription method" 
    } 

    override var description : String { 
     return "description Method" 
    } 
} 

Test:

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 

La chose qui m'a surpris est que po sur des objets Swift appelle description plutôt que debugDescription qui diffère de ObjC.

EDIT

Pour le faire agir comme avec ObjC, votre classe doivent mettre en œuvre CustomDebugStringConvertible et po appellera debugDescription, qui par défaut appelle description.La seule chose qui doivent être changé dans mon exemple serait d'ajouter:

class Test : NSObject, CustomDebugStringConvertible 

Reference

Vérifié avec XCode 7.0.1 et iOS SDK 9, Swift 2.0

Questions connexes