83 votes

Xcode/GDB: Comment obtenir des informations sur une exception qui a été tout simplement jetés?

OK, imaginez donc que mon point d'arrêt en objc_exception_throw a juste déclenché. Je suis assis à l'invite de débogueur, et je veux obtenir plus d'informations sur l'objet de l'exception. Où puis-je le trouver?

161voto

Fnord Points 2214

L'objet de l'exception est passé comme premier argument à l' objc_exception_throw. La syntaxe de se référer à elle repose sur les conventions d'appel de l'architecture, vous êtes en cours d'exécution sur. Si vous êtes de débogage sur un appareil iOS, le pointeur de l'objet est dans le registre r0. Pour l'imprimer ou d'envoyer des messages, utilisez la syntaxe simple suivante:

(gdb) po $r0
(gdb) po [$r0 name]
(gdb) po [$r0 reason]

Sur le Simulateur d'iPhone, tous les arguments d'une fonction sont passés sur la pile, donc la syntaxe est beaucoup plus horrible. Le plus court de l'expression j'ai pu construire qui obtient, elle, est *(id *)($ebp + 8). Pour rendre les choses moins douloureuses, je vous suggère d'utiliser un confort variable:

(gdb) set $exception = *(id *)($ebp + 8)
(gdb) po $exception
(gdb) po [$exception name]
(gdb) po [$exception reason]

Vous pouvez également définir $exception automatiquement à chaque fois que le point d'arrêt est déclenchée par l'ajout d'une liste des commandes à l' objc_exception_throw point d'arrêt.

(Notez que dans tous les cas je l'ai testé, l'objet de l'exception était également présent dans l' eax et edx registres à la fois le point d'arrêt frappé. Je ne suis pas sûr que ça va toujours être le cas, cependant).

Ajout de commentaire ci-dessous:

Dans lldb, sélectionnez le bloc de pile pour objc_exception_throw , puis saisissez cette commande:

(lldb) po *(id *)($esp + 4)

13voto

Sheehan Alam Points 13754

Bon article expliquant comment déboguer vos exception:

http://cocoadev.com/DebuggingTechniques

10voto

João Nunes Points 565

sur les nouveaux simulateurs de xcode 6 im en utilisant:

po $rax

5voto

je44ery Points 395

Au moment d'écrire ces lignes, ce post est mon top Google a frappé pour: lldb impression exception. Ainsi, suis-je ajouter à cette réponse de compte pour lldb et x86_64.

Mes tentatives pour trouver l'exception à l'aide de po $eax a échoué avec l' error: Couldn't materialize struct: Couldn't read eax (materialize). D'autres tentatives décrites dans les documents liés partir plus tôt, les réponses ont également échoué.

L'essentiel était que je devais d'abord cliquer sur l' objc_exception_throw image dans mon thread principal. lldb ne partez pas dans ce cadre.

Dans toutes mes recherches et les exemples suivants, cette entrée de blog a été le premier à expliquer les choses d'une façon qui ont travaillé pour moi. Elle est plus moderne, publiés en Août 2012.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X