Encore un problème de mémoire...

chaps31chaps31 Membre
21:49 modifié dans API AppKit #1
Ce coup-ci c'est sur une variable interne à  une méthode... il s'agit d'un NSMutableString auquel j'envoie un length, et erreur... problème de "bound"... bon donc je mets qques breakpoint et dans le debbuger:

(gdb) po [upd class]<br />NSCFString<br />Current language:&nbsp; auto; currently objective-c<br />(gdb) po [upd length]<br />Cannot access memory at address 0xa2<br />(gdb) po upd<br />INSERT INTO (blabla... c&#39;est la bonne valeur)


B)   La variable est là  elle a une valeur, j'obtiens sa classe, sa valeur mais pour le length erreur d'accès mémoire... Là  vraiment je ne comprends pas... Au secours.... :why?: :crackboom:-

Réponses

  • AliGatorAliGator Membre, Modérateur
    21:49 modifié #2
    Non non, tout fonctionne très bien, c'est une erreur d'utilisation des commandes du débuggeur de ton côté.

    "po" est un raccourci pour la commande "print-object", qui a pour but d'afficher à  l'écran la valeur d'un NSObject. C'est à  dire qu'en gros demander à  gdb "po tonObjet" fait comme un NSLog(@%@,tonObjet) dans ton code : ça appelle la méthode description" sur ton objet, qui retourne une représentation sous forme de chaà®ne (NSString) de ton objet pour être affichée.

    Or "length" ne te retourne pas un objet, c'est un entier. Du coup demander à  gdb "po [upd length]" fait qu'il va récupérer la longueur de upd (162 caractères)... et interpréter ça comme un NSObject (se trouvant à  l'adresse mémoire 162=0xa2) à  afficher... donc essayer de lui envoyer le message "description"... et boum, "Cannot access memory at address 0xa2".

    Il faut tout simplement que tu "castes" le type de retour si ce n'est pas un objet :
    (gdb) po (int)[upd length]
    
  • chaps31chaps31 Membre
    21:49 modifié #3
    (gdb) po (int)[upd length]<br />Cannot access memory at address 0xa0
    



    Incompréhensible...
  • Philippe49Philippe49 Membre
    21:49 modifié #4
    man gdb :

    print expr
    Display the value of an expression.


    soit ici : (gdb) print [updlength]
  • chaps31chaps31 Membre
    21:49 modifié #5
    (gdb) po upd<br />INSERT INTO (...)<br />Current language:&nbsp; auto; currently objective-c<br />(gdb) (gdb) print [upd length]<br />Unable to call function &quot;objc_msgSend&quot; at 0x9474b900: no return type information available.
    
  • Philippe49Philippe49 Membre
    novembre 2009 modifié #6
    <br />14.4.2.2 The Print Command With Objective-C<br />The print command has also been extended to accept methods. For example:<br />print -[object hash]<br />will tell gdb to send the hash message to object and print the result. <br />Also, an additional command has been added, print-object or po for short, which is meant to print the description of an object. <br />However, this command may only work with certain Objective-C libraries that have a particular hook function, _NSPrintForDebugger, defined.<br />
    


    Essaie print -[upd length]
  • chaps31chaps31 Membre
    21:49 modifié #7
    (gdb) print -[upd length]<br />Unable to call function &quot;objc_msgSend&quot; at 0x9474b900: no return type information available.
    


    Et derrière il y a un pb de "bound" sur un delete qui se sert de length... donc réellement un soucis je ne vois vraiment pas pourquoi...

    Bon j'ai contourné le problème en codant différemment mais n'empêche que j'aimerais bien comprendre, face à  un problème le contourner ne fait pas progresser et il y a toujours le risque d'avoir un retour du problème plus loin...
  • AliGatorAliGator Membre, Modérateur
    21:49 modifié #8
    Mais non, il faut de toute façon caster, comme j'ai mis plus haut ! Sauf que plus haut j'aurais pas dû utiliser print-object (enfin "po" pour les intimes), mais juste "print".

    print (int)[opd length]
  • chaps31chaps31 Membre
    21:49 modifié #9
    And the winner is... again...Ali !  <3 <br />
    Faut que je trouve de la doc sur ce que je peux mettre dans le debugger lors de breakpoint...
Connectez-vous ou Inscrivez-vous pour répondre.