S'arrêter sur les sélecteurs inconnus

CéroceCéroce Membre, Modérateur
Bonjour à  tous,

Dans la console, j'obtiens ce message à  l'exécution:

-[NSCFArray repr]: unrecognized selector sent to instance 0x17d390


Le runtime me dit qu'une instance de NSArray a reçu un appel à  la méthode repr qu'il ne connaà®t pas. Mon soucis, c'est que j'ai beaucoup d'endroits dans mon programme où la méthode repr est appelée.

Puis-je arrêter le débogueur sur ce genre de messages ? J'ai cherché un peu dans la doc du runtime, mais je n'ai pas trouvé le nom de la fonction appelée en cas d'impossibilité de résoudre la méthode.

Réponses

  • AntilogAntilog Membre
    22:23 modifié #2
    Peut-être ceci t'aidera???

    http://www.objective-cocoa.org/forum/index.php?topic=1778.0

    Trouvé dans un super forum!
    :brule:
  • MalaMala Membre, Modérateur
    22:23 modifié #3
    Mettre un breakpoint du genre:
    <br />[NSException raise]<br />
    

    Il me semble qu'il devrait s'arrêter sur un "unrecognized selector" mais depuis le passage à  XCode 3.0 j'ai des soucis avec les breakpoints. Pas vous?
  • 22:23 modifié #4
    Pourquoi on utiliserait pas plutôt "respondsToSelector:" ?  :o
  • schlumschlum Membre
    22:23 modifié #5
    dans 1229428674:

    Pourquoi on utiliserait pas plutôt "respondsToSelector:" ?  :o


    Parce qu'il faut déjà  qu'il trouve l'endroit du bug pour ça  :P
  • schlumschlum Membre
    22:23 modifié #6
    dans 1229426535:

    Mettre un breakpoint du genre:
    <br />[NSException raise]<br />
    

    Il me semble qu'il devrait s'arrêter sur un "unrecognized selector" mais depuis le passage à  XCode 3.0 j'ai des soucis avec les breakpoints. Pas vous?


    Normalement oui, ça balance une exception...
  • MalaMala Membre, Modérateur
    22:23 modifié #7
    Chez moi ça marche pas. C'est bien ce qui me semblait que ça fonctionnait plus depuis le passage à  Xcode 3 sur Léopard.

    Je m'étais même fait un petit .gdbinit qui va bien à  la racine de mon répertoire user:
    <br />fb -[NSException raise]<br />fb objc_exception_throw()<br />
    


    Et nada, Xcode ne s'arrête plus sur aucune exception même un simple objectAtIndex: hors limite avec un NSArray.
  • CéroceCéroce Membre, Modérateur
    22:23 modifié #8
    Merci à  vous!
    Je trouve l'astuce qui ajoute une catégorie à  NSObject bien intéressante...

    J'ai fait un petit programme pour essayer ça, avec un bouton qui actionne une simple méthode:

    - (IBAction) buttonPressed:(id)sender<br />{<br />	@try<br />	{<br />		[sender taMereEnShort];<br />	}<br />	@catch(NSException *exception)<br />	{<br />		NSLog(@&quot;attrapée.&quot;);<br />	}<br />	<br />	[sender tonPereEnTongs];<br />}
    


    La première exception est bien attrapée (NSInvalidArgumentException).
    Et le débogueur s'arrête bien sur
    [NSException raise]

    (depuis XCode 3, le débogueur marche plutôt mieux qu'avant chez moi).


    Par contre, il faut voir la tronche de la pile d'appels:
    #0	0x93bbdab8 in -[NSException raise]<br />#1	0x905b0774 in -[NSControl mouseDown:]<br />#2	0x905aee3c in -[NSWindow sendEvent:]<br />#3	0x905821e0 in -[NSApplication sendEvent:]<br />#4	0x904ef4b8 in -[NSApplication run]<br />#5	0x904bfe94 in NSApplicationMain<br />#6	0x00001d4c in main at main.m:13
    


    Bref, je vais sans doute utiliser les catégories, à  moins que vous ne connaissiez une meilleure méthode.

  • schlumschlum Membre
    22:23 modifié #9
    Bizarre ta pile... elle semble incomplète.
  • CéroceCéroce Membre, Modérateur
    22:23 modifié #10
    En effet... l'interfaçage XCode <-> gdb a toujours été un mystère pour moi. Il semble que ça ne marche correctement chez personne.
  • AliGatorAliGator Membre, Modérateur
    22:23 modifié #11
    dans 1229434805:

    En effet... l'interfaçage XCode <-> gdb a toujours été un mystère pour moi. Il semble que ça ne marche correctement chez personne.
    Ca me rassure, j'ai jamais rien compris à  cet interfaçage avec le debuggeur que je trouve pas super, en théorie il est bien foutu mais en pratique j'ai jamais réussi à  bien l'utiliser... sans doute aussi parce qu'il ne marchait pas top et que parfois je faisait sans doute ce qu'il faut mais ça se comportait pas comme je voulais pour autant..;
  • schlumschlum Membre
    22:23 modifié #12
    gdb fonctionne bien à  la base  :P
  • AliGatorAliGator Membre, Modérateur
    22:23 modifié #13
    C'est pour ça qu'on prend soin de parler de "l'interfaçage de Xcode avec le débuggueur" et pas du debuggueur lui-même (gdb) :P
    Mais j'avoue ne pas du tout savoir l'utiliser en ligne de commande, je m'y suis jamais plongé.
  • schlumschlum Membre
    22:23 modifié #14
    dans 1229454212:

    C'est pour ça qu'on prend soin de parler de "l'interfaçage de Xcode avec le débuggueur" et pas du debuggueur lui-même (gdb) :P
    Mais j'avoue ne pas du tout savoir l'utiliser en ligne de commande, je m'y suis jamais plongé.


    C'est plus facile qu'avec l'interfaçage  :P
    Lance le, et tapes "help", tu verras  ;)
Connectez-vous ou Inscrivez-vous pour répondre.