[Débutant] Débugguer un programme - Trouver quel est l'objet qui a telle adresse.

[SDK 10.6, Xcode 4.2]



Bonjour,



mon programme me lance l'erreur suivante dans la console :
<br />
-[NSTextField copyWithZone:]: unrecognized selector sent to instance 0x1001ca580<br />




J'aimerais savoir qui est l'objet 0x1001ca580.



Comment puis-je faire ?

Je sais que ce qui cause problème est la ligne N
  • Si je met un breakpoint sur la ligne N, le compilateur s'arrête à  cette ligne et me donne des adresses d'objets, mais mon erreur n'est pas encore dans la console. Je sais qui sont les objets, mais je ne sais pas qui va buguer.
  • Si je mets le breakpoint juste après la ligne N, j'ai le message d'erreur, mais la fenêtre où s'affichaient les adresses des objets est vide : je ne sais plus qui est qui.


Merci !

Réponses

  • 'colas2' a écrit:


    [SDK 10.6, Xcode 4.2]



    Bonjour,



    mon programme me lance l'erreur suivante dans la console :
    <br />
    -[NSTextField copyWithZone:]: unrecognized selector sent to instance 0x1001ca580<br />
    




    J'aimerais savoir qui est l'objet 0x1001ca580.



    Comment puis-je faire ?

    Je sais que ce qui cause problème est la ligne N
    • Si je met un breakpoint sur la ligne N, le compilateur s'arrête à  cette ligne et me donne des adresses d'objets, mais mon erreur n'est pas encore dans la console. Je sais qui sont les objets, mais je ne sais pas qui va buguer.
    • Si je mets le breakpoint juste après la ligne N, j'ai le message d'erreur, mais la fenêtre où s'affichaient les adresses des objets est vide : je ne sais plus qui est qui.


    Merci !




    Je pense que tu ne prends pas le problème dans le bon sens... En fait tu devrais plutôt regarder la doc Apple de NSTextField...

    Apparemment tu dois essayer d'utiliser la méthode copy qui n'est pas utilisable avec un NSTextField.

    Par ailleurs, pour ce genre de question, c'est préférable de mettre le code qui te génère l'erreur...
  • J'ai finalement résolu l'erreur mais un peu par chance, je crois.

    Je n'ai pas utilisé la méthode copy.



    Pour supprimer le bug, j'ai ajouté une @property sur un IBOutlet.



    Mais le problème est revenu depuis image/smile.png' class='bbc_emoticon' alt=':)' />

    Comme je suis débutant, je ne sais pas utiliser le debbugueur.

    Je m'imaginais que c'était simple de voir qui est qui (adresses <-> objets) quelque part : ça aurait pu (ou ça pourra) me mettre sur la piste !
  • C'est en forgeant qu'on devient forgeron!

    Lances toi! Apple doit proposer un tutoriel quelque part! Ce n'est jamais du temps de perdu de commencer par là , d'essayer d'y mettre des points d'arrêt ou d'y faire des modifications!

    Après tu nous poseras des questions sur des points précis et nous pourrons te répondre précisément.

    Je sais, les débuts sont souvent exaspérants et pénibles.
  • Merci !
  • HerveHerve Membre
    Après le 350° plantage, on commence à  comprendre...
  • ... qu'on sera encore meilleur après le 5.000 iéme plantage !
  • AliGatorAliGator Membre, Modérateur
    Normalement tu peux la voir cette correspondance adresse/objet. Si tu mets un breakpoint sur la ligne que tu indiques, quand le déboggueur s'arrête tu vois la liste des variables, de leurs adresses, et des objets que ces variables contiennent (= des objets vers lesquels ces adresses pointent), comme tu as pu le voir.



    Une fois que ça a planté, normalement si ça plante dans le même contexte, tu peux le voir aussi. Sauf que ça plante certainement dans une sous-sous-sous-méthode à  l'intérieur des frameworks Apple, le temps qu'il se rende compte que tu as essayé d'appeler une méthode qui n'existe pas sur l'objet en question, qu'il essaye quand même de s'en sortir, et finisse par te sortir l'exception, et qu'entre temps tu as perdu la trace de ta variable (que l'objet qui pose problème est dans une variable interne au framework Apple, variable qui n'est pas exposée/visible à  l'extérieur donc ne s'affiche pas dans la liste des variables là  où tu t'y attendais).



    Il faut donc remonter dans le contexte de la méthode où tu as mis le breakpoint, via la "Call Stack" (ou "Pile d'Appels") que tu as dans un des onglets dans le volet de gauche (le même volet où il y a la liste des fichiers dans un onglet, des breakpoints dans un autre, des warning dans un autre...), pour remonter quelques appels plus hauts, dans les méthodes qui ont appelé la méthode qui a planté (donc celle où tu avais mis ton breakpoint à  l'origine, dans ton cas). Là  tu te retrouveras dans le contexte de ta méthode et retrouveras tes objets avec leurs adresses etc.



    Autre possibilité, c'est que tu as un écrasement mémoire et qu'en fait l'adresse en question pointe sur n'importe quoi. Ce qui peut arriver si tu n'utilises pas ARC dans ton projet (qui facilite la gestion mémoire et limite le risque de pointeurs flottants (dandling pointers) ou d'écrasement mémoire) et que tu avais une variable qui pointait sur un NSTextField avant, NSTextField qui a depuis disparu / a été détruit, mais du coup ta variable pointe sur un espèce de reste de ruines de faux NSTextField qui n'en est plus vraiment un, avec l'adresse qui pointe du coup en vrai sur tout autre chose ou sur de la mémoire corrompue... et du coup patatras !

    Et pour ça, activer les "Zombies" (NSZombiesEnabled=YES, ou juste la case à  cocher dans ton Scheme) aide bien à  savoir quel est l'objet qui a été supprimé et sur lequel tu essayes quand même d'appeler des méthodes qui font qu'il s'emmêle les pinceaux et plante.
  • tabliertablier Membre
    mars 2013 modifié #9
    En complément de ce que dit Ali, je te conseille de dévalider les optimisations quand tu mets des points d'arrêt. Les optimisations ne facilitent pas les débuggages.
    ... qu'on sera encore meilleur après le 5.000 iéme plantage
    C'est vrai, mais des amateurs comme moi seront quelque part, toujours des débutants. A tel point qu'après 7 ans de présence sur le site, Ali a du utiliser le fouet pour m'obliger à  relire un passage de la doc sur les NSOperation (et il avait raison).
  • 'tablier' a écrit:


    A tel point qu'après 7 ans de présence sur le site, Ali a du utiliser le fouet pour m'obliger à  relire un passage de la doc sur les NSOperation (et il avait raison).




    Mmmm ! Le fouet !! Oui c'est bon. Encore, encore, ... image/whip.gif' class='bbc_emoticon' alt=' >:) ' />



    Ouh là  ! Je m'égare là  image/crazy.gif' class='bbc_emoticon' alt=' B) ' />



    (petite précision, il semble bien que le fouet c'était pour les variables globales, pas pour la lecture de la doc, mais c'est un détail)
  • il semble bien que le fouet c'était pour les variables globales, pas pour la lecture de la doc, mais c'est un détail
    Oui, mais cela m'a obligé à  relire la documentation sur la manière de passer des informations entre NSOperation.
  • CéroceCéroce Membre, Modérateur
    Juste pour répondre à  la question, on peut taper dans la console:
    po 0x1001ca580<br />
    


    po signifie print object.

    ça affiche le résultat de la méthode -description. En l'occurrence, ça doit simplement afficher qu'il s'agit d'un NSTextField à  l'adresse 0x1001ca580.
  • 'Céroce' a écrit:


    Juste pour répondre à  la question, on peut taper dans la console:
    po 0x1001ca580<br />
    


    po signifie print object.

    ça affiche le résultat de la méthode -description. En l'occurrence, ça doit simplement afficher qu'il s'agit d'un NSTextField à  l'adresse 0x1001ca580.


    En complément à  Ceroce, si c'est un NSTextField parmi d'autres, pour savoir lequel tu peux taper, toujours dans le débugger et en gardant la référence supra

    po [0x1001ca580 stringValue]

    ça donne la valeur présente du champ et ça permet de repérer lequel plus facilement.

    Tu peux aussi regarder dans la console tes variables et tenter de repérer 0x1001ca580 en face d'un nom de variable.

    Si ton textfield est partie d'un Controller il y a des chances pour que tu te retrouves dans une des méthodes de ce controller, pour en voir les champs il faudra déplier "self" qui représente le controller dans la colonne de gauche de la console, celle avec un popup Auto.
Connectez-vous ou Inscrivez-vous pour répondre.