Forcer XCode a s'arrêter sur une exception...

MalaMala Membre, Modérateur
11:47 modifié dans Objective-C, Swift, C, C++ #1
Si comme moi vous avez de temps en temps des exceptions générées par votre projet et que vous n'en connaissez pas l'origine exacte  (ex: un objectAtIndex qui déborde dans l'un de vos 34234 NSArray...  :fouf): ), c'est toujours irritant et on aimerait bien remonter rapidement à  la source.  :why?:

La plupart connaissent sans doute déjà  l'astuce mais comme je l'ai pas aperçue dans le forum, je la balance.  :)

A la racine du répertoire utilisateur, créez un fichier texte nommé ".gdbinit". Editez le pour y ajouter les lignes suivantes:
<br />fb -[NSException raise]<br />fb objc_exception_throw()<br />


Quittez votre session puis relancez XCode. Ca y est c'est bon. Maintenant, lorsque vous aurez une exception inopinée, lancez votre appli en mode debug et dès que l'exception  sera levée, XCode vous enverra à  la source comme un grand.

Voilà , ça ne révolutionnera pas le monde mais ça peut faire gagner du temps.  ;)

NB: il est tout à  fait possible d'ajouter le point d'arrêt -[NSException raise] directement dans XCode mais là  l'avantage du fichier de config c'est que ce sera automatique pour tous les projets.

Réponses

  • 11:47 modifié #2
    Intéressant... as tu une page pour ces options possibles... j'ai fait une petite recherche google mais je ne trouve rien de très parlant moi jeune petit supermic.

    Je comprends bien le "[NSException raise]"
    Mais qu'est ce que l'argument "fb" ?
    Pourquoi "objc_exception_throw" ?

    Merci !
  • MalaMala Membre, Modérateur
    11:47 modifié #3
    J'avais trouvé l'info ici...
    Tips From Big Nerd Ranch
    mais ils n'en disent pas plus sur les options.

    fb signifie "forward break" il me semble. Pour objc_exception_throw(), cette fonction doit permettre de lever une exception au niveau du code C pour les couches les plus basses.
  • schlumschlum Membre
    11:47 modifié #4
    Est-ce que [NSException raise] n'envoie pas un objc_exception_throw() d'ailleurs ?
    Ca me paraà®trait logique...
  • MalaMala Membre, Modérateur
    11:47 modifié #5
    dans 1178098730:

    Est-ce que [NSException raise] n'envoie pas un objc_exception_throw() d'ailleurs ?
    Ca me paraà®trait logique...

    Oui moi aussi. Histoire de le vérifier j'ai désactivé la première ligne hier. A ma grande surprise je viens de constater à  l'instant que le débogueur ne s'arrête plus sur un "selector not recognized".  :o
  • schlumschlum Membre
    mai 2007 modifié #6
    Effectivement...
    Il passe dans _NSRaiseError() qui doit gérer ça en C++ ou autre.
Connectez-vous ou Inscrivez-vous pour répondre.