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?
Réponses
Trop de publicités?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)
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.