Xcode/LLDB: Comment obtenir des informations sur une exception qui a été tout simplement jetés?
OK, imaginez donc que mon point d'arrêt dans 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?
Rappelez-vous, l'exception a été soulevée, sa description n'a pas été imprimé sur la console encore.
Découvrez cette question: stackoverflow.com/questions/711650
Découvrez cette question: stackoverflow.com/questions/711650
OriginalL'auteur Karoy Lorentey | 2010-07-25
Vous devez vous connecter pour publier un commentaire.
L'objet exception est passé comme premier argument à
objc_exception_throw
. LLDB fournit$arg1
..$argn
variables à se référer à des arguments dans le bon convention d'appel, le rendant simple pour imprimer les détails de l'exception:Assurez-vous de sélectionner le
objc_exception_throw
image dans la pile des appels avant d'exécuter ces commandes. Consultez la rubrique "Avancée Débogage et l'Adresse de Désinfectant" dans le WWDC15 session de vidéos pour voir ce produit sur la scène.Des Informations Obsolètes
Si vous êtes sur GDB, la syntaxe pour désigner le premier argument 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: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 que devient il est
*(id *)($ebp + 8)
. Pour rendre les choses moins douloureuses, je vous suggère d'utiliser un confort variable: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.(À noter que dans tous les cas je l'ai testé, l'objet de l'exception était également présent dans les
eax
etedx
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:pouvez-vous préciser la source de cette info? j'aimerais en lire plus
Actuellement la suivante fonctionne pour moi avant le prologue quand breaing sur
objc_exception_throw
dans LLDB:po *(id *)($esp + 4)
.Cela a fonctionné! Cependant, il ne fonctionne pas jusqu'à ce que j'ai sélectionné cadre de la pile 0. (
objc_exception_throw
).po $eax
travaille pour moi dans le simulateur comme pendentif à l'$r0
quand sur l'appareil.OriginalL'auteur Karoy Lorentey
sur les nouveaux simulateurs d'iOS 8, 64 bits) xcode 6 im en utilisant à l'exception de châssis:
objc_exception_throw
en 32 bits:
Qu'est-ce que rax?
Rax est un 64bits registre, qui remplace l'ancienne eax
Comment trouver tous les registres?
Source wikipedia
simulateur ou de l'appareil? j'ai essayé cela avec 6.0.1
Pouvez-vous nous fournir un lien vers votre source pour ça? Merci!
J'ai juste écrit dans lldb: registre de lecture . Puis, avec cette info, nous savons que le premier registre à l'exception cadre détient le message d'exception.
Ok j'ai trouvé de la doc: rax est un 64bits vous inscrire: En 64 bits long de la mode, vous pouvez utiliser des registres 64 bits (par exemple, rax au lieu de eax, rbx au lieu de ebx, etc..)
OriginalL'auteur João Nunes
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é avecerror: 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 le
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.
OriginalL'auteur Jeff
Si vous avez une instruction catch, mettre un point d'arrêt et que vous pouvez inspecter l'objet de l'exception à ce point.
Si vous n'avez pas une instruction catch, continuer.
Vous recevrez un message dans votre terminal comme ceci:
Résiliation d'application en raison de uncaught exception 'NSInvalidArgumentException', la raison: '* -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: essayez d'insérer néant objet à partir d'objets[0]'
Cependant, vous êtes probablement à la recherche d'un moyen pour l'inspecter sans poursuivre puisque vous allez perdre votre belle trace de la pile lorsque l'application est terminée.
Pour que ça sonne comme Fnord de réponse est meilleur, mais je n'étais pas en mesure de le faire fonctionner dans LLDB.
OriginalL'auteur funroll