Existe-t-il une commande LLDB qui peut convertir une adresse brute en une classe Swift utilisable?
Par exemple:
(lldb) po 0x7df67c50 as MKPinAnnotationView
Je sais que cette adresse pointe vers un MKPinAnnotationView, mais ce n'est pas dans un cadre que je peux sélectionner. Mais, je veux convertir l'adresse brute dans un MKPinAnnotationView afin que je puisse examiner ses propriétés. Est-ce possible?
(lldb)
dans ma console. Mais cela n'a pas fonctionné sans cela.expr -l Swift --
..Vous pouvez utiliser la
unsafeBitCast
fonction de Swift pour convertir une adresse en une instance d'objet:Ensuite, vous pouvez travailler avec
$pin
comme d'habitude - accéder aux propriétés, aux méthodes d'appel, etc.Consultez cet article pour plus d'informations: Swift Memory Dumping .
la source
(lldb) settings set target.language swift
. De plus, dans certains cas (par exemple, lorsque vous sortez du module de votre application lors de la diffusion vers un type de votre application), vous devrez peut-être suivre cela avec une import MyApp
Le format lldb
expression
semble avoir changé dans Xcode 7.3. Ce qui suit m'a permis de démarrer:la source
Pour les classes personnalisées, vous devez importer votre projet
la source
À partir de Xcode 8 / Swift 3, voici ce qui a fonctionné pour moi. (Ceci est basé sur la réponse de @ sfaxon .)
la source
Grâce à toutes les réponses ci-dessus, unsafeBitCast fonctionne également bien avec Xcode 8.3.2 / Swift 3 / macOS / Cocoa Application.
Mémoriser une adresse de l'instance actuelle
Plus tard, examinez-les
Si quelque chose comme ça arrive
assurez-vous de choisir l'un des cadres de pile du code source Swift plutôt que celui de l'assembleur.
Cela est susceptible de se produire lorsque l'application a été suspendue en cliquant sur un bouton Pause ou arrêtée avec une exception. En choisissant un cadre de pile en conséquence, laissez lldb déduire un langage de programmation approprié.
la source
Version Objective-C
la source
Debug View Hierarchy
vue, j'ai fait un clic droit sur une vue, puis j'ai été sélectionnéePrint description of...
. Cela m'a donné une adresse mémoire et un type que je pourrais insérer dans le code ci-dessus. C'est bien de savoir que le débogueur visuel place la console dans un cadre Obj-C.Il m'a fallu plus de temps pour comprendre que j'aimerais l'admettre. C'est similaire à la réponse @afinlayson, mais avec une meilleure explication (j'espère!) Et une syntaxe fixe
Si vous souhaitez vérifier les propriétés d'un objet à l'aide du débogueur de hiérarchie de vues de Xcode, cela fonctionnera: vous êtes dans le contexte objc par défaut, vous devrez donc le basculer vers le contexte Swift
expr -l Swift -- import <YOUR PROJECT NAME>
expr -l Swift -- let $vc = unsafeBitCast(0x7fb7c51cb270, to: <YOUR PROJECT NAME>.<YOUR CUSTOM CLASS NAME>.self)
expr -l Swift -- print($vc.<PROPERTY NAME>)
Exemple:
expr -l Swift -- import Football
expr -l Swift -- let $vc = unsafeBitCast(0x7fb7c51cb270, to: Football.Ball.self)
expr -l Swift -- print($vc.velocity)
la source
La réponse de @Xi Chen fonctionne parfaitement lorsque votre session LLDB a été lancée dans un contexte Swift. Cependant, dans certains cas, vous vous êtes peut-être arrêté dans un point d'arrêt en dehors d' un contexte Swift; par exemple, lorsqu'il s'agit d'un point d'arrêt symbolique vers l'API Objective-C, ou en mode Debug View Hierarchy (au moins à partir de Xcode 11.4).
Dans ce cas, vous devrez le faire à l'ancienne en utilisant Objective-C:
et maintenant vous pouvez utiliser
$pin
comme vous le feriez.la source
po
est un alias, ce qui signifie qu'il peut être remplacé. Vous pouvez remplacerpo
en gérant les adresses hexadécimales en utilisant objc:Pour voir quel effet cela a, vous pouvez dire à lldb de développer ces alias:
J'ai également créé https://github.com/kastiglione/swift_po , qui est un substitut
po
à Swift. Il gère les adresses d'objets et présente également quelques autres améliorations.la source
expression -l objc -O -- 0x76543210
est juste la réponse pour moi, et il n'est pas nécessaire de connaître la classe variable de l'adresse!Le moyen le plus simple, rapide 4
la source