Je ne vois aucune fonction dans le runtime qui pourrait supprimer une méthode d'une classe.
Tu peux "supprimer" l'implémentation d'une méthode mais tu peux pas supprimer l'objet Method lui-même de la class... C'est très bizarre... Il faudrait savoir à quel moment ce changement est opéré, soit c'est un gros bogue du runtime, soit je reviens à mon autre idée de créer un autre projet... ça n'a pas l'air en rapport mais pourtant ça marche bien des fois... Sur des bogues totalement sans rapport ou inexpliqués...
Je ne vois aucune fonction dans le runtime qui pourrait supprimer une méthode d'une classe.
Tu peux "supprimer" l'implémentation d'une méthode mais tu peux pas supprimer l'objet Method lui-même de la class... C'est très bizarre... Il faudrait savoir à quel moment ce changement est opéré, soit c'est un gros bogue du runtime, soit je reviens à mon autre idée de créer un autre projet... ça n'a pas l'air en rapport mais pourtant ça marche bien des fois... Sur des bogues totalement sans rapport ou inexpliqués...
Tout se passe comme si la 1ere exécution de cette méthode provoquait la disparition de celle-ci ;-) Je suis trop novice pour piger ce qui se passe, mais c'est assez impressionnant: tout se passe très bien lors de la première exécution. Après, il semble que mon instance ne propose plus cette méthode: tout simplement...
• Lance le projet ci-joint en mode debug, en mettant un breakpoint sur la ligne str=memset(.... • En passant la souris tu récupères l'adresse de str • Fait un clic-droit dans la fenêtre du debugger, et observe la mémoire (suffisamment d'octets) • Au-delà de str il y a des octets, peut-être sont-ils utilisés à autre chose : une méthode, une référence, une autre variable • fait step into, continue et clique sur le bouton
• Lance le projet ci-joint en mode debug, en mettant un breakpoint sur la ligne str=memset(.... • En passant la souris tu récupères l'adresse de str • Fait un clic-droit dans la fenêtre du debugger, et observe la mémoire (suffisamment d'octets) • Au-delà de str il y a des octets, peut-être sont-ils utilisés à autre chose : une méthode, une référence, une autre variable • fait step into, continue et clique sur le bouton
Tu vois le bug en temps réel
J'essaie ça tout de suite merci.
Mais on avance !
... j'ai placé ce NSLog après chaque ligne exécutée dans cette méthode, et le coupable est (j'ai honte) :
un strcpy ...
Je souçonne qu'il se prend les pieds dans le tapis en allant taper dans une zone mémoire allouée. Enfin, en bref, je sens bien le coup que tout ça vienne de ma méconnaissance des fonctions C sur les string. Je vais essayer de mieux gérer mes malloc car je sens que c'est de là que vient l'embrouille.
Bon... Fais voir ton appel strcpy()... Et surtout montre-nous où tu alloues/modifies les paramètres que tu passes à cette fonction...
ça y est, c'est trouvé: honte à moi :
Je manipulais tellement de chaà®nes C que je me suis pris les pieds dans le tapis, en faisant un malloc sur le mauvais pointeur, si bien que celui que j'utilisais dans strcpy n'avait pas de mémoire allouée, donc la pioche à mémoire s'est servie, et le reste a déboulé en cascade...
Une vraie honte pour moi. Mais je suis très impressionné de voir les conséquences que cela a pu avoir (disparition d'une méthode d'instance).
Cela va sans dire que votre aide (et votre acharnement a m'aider) m'a été précieuse. Pas tant dans la connerie à l'origine du problème que dans toutes les choses que j'ai pu apprendre au cours de ce pistage.
Merci à tous. Et là , le coup du malloc sur le mauvais pointeur, promis, il va rester gravé !!! Comme l'utilité de la fonction "class_getInstanceMethod" ;-)
Le plus impressionnant selon moi c'est le fait que tu tombes à chaque fois sur le même résultat...
Et sans vouloir être méchant, mais pour quand même en remettre une couche... Je soupçonne qu'une mauvaise hygiène de vie concernant le respect des conventions t'as mené à ce genre de résultat... ;D
Je manipulais tellement de chaà®nes C que je me suis pris les pieds dans le tapis, en faisant un malloc sur le mauvais pointeur, si bien que celui que j'utilisais dans strcpy n'avait pas de mémoire allouée, donc la pioche à mémoire s'est servie, et le reste a déboulé en cascade...
Ce sont des erreurs difficiles à localiser, car le C étant (très) permissif, l'exécution ne s'arrête pas forcément à l'endroit où il y a erreur. Pour compléter les bonnes recommandations de Psychoh, j'ajouterais qu'une avance dans un projet en emboà®tant des sous-projets successifs (ou en partitionnant) peut permettre de voir les erreurs à temps . Par exemple, ici faire un sous-projet testant le bon fonctionnement de la lecture de la BDD, en cherchant à le pousser dans ses derniers retranchements, puis un autre sur le bon fonctionnement du singleton, puis l'interface .... Amen
Le plus impressionnant selon moi c'est le fait que tu tombes à chaque fois sur le même résultat...
Et sans vouloir être méchant, mais pour quand même en remettre une couche... Je soupçonne qu'une mauvaise hygiène de vie concernant le respect des conventions t'as mené à ce genre de résultat... ;D
Oui, en l'occurrence c'est un "malloc" sur le mauvais pointeur. Si ma mémoire est bonne, il s'est agit d'un d'un copier/coller ... Pour ce qui est des conventions, je vais relire le bouquin de Kochan pour bien les imprimer. Merci encore.
Je manipulais tellement de chaà®nes C que je me suis pris les pieds dans le tapis, en faisant un malloc sur le mauvais pointeur, si bien que celui que j'utilisais dans strcpy n'avait pas de mémoire allouée, donc la pioche à mémoire s'est servie, et le reste a déboulé en cascade...
Ce sont des erreurs difficiles à localiser, car le C étant (très) permissif, l'exécution ne s'arrête pas forcément à l'endroit où il y a erreur. Pour compléter les bonnes recommandations de Psychoh, j'ajouterais qu'une avance dans un projet en emboà®tant des sous-projets successifs (ou en partitionnant) peut permettre de voir les erreurs à temps . Par exemple, ici faire un sous-projet testant le bon fonctionnement de la lecture de la BDD, en cherchant à le pousser dans ses derniers retranchements, puis un autre sur le bon fonctionnement du singleton, puis l'interface .... Amen <br />
En effet. Le projet en question n'est pas un projet de "production", mais juste un projet pour apprendre à développer avec ObjC et Cocoa.. Pour ne voir que le bon coté des choses: j'ai beaucoup appris (grace à vous, il est vrai). Encore merci.
Réponses
Tu peux "supprimer" l'implémentation d'une méthode mais tu peux pas supprimer l'objet Method lui-même de la class... C'est très bizarre... Il faudrait savoir à quel moment ce changement est opéré, soit c'est un gros bogue du runtime, soit je reviens à mon autre idée de créer un autre projet... ça n'a pas l'air en rapport mais pourtant ça marche bien des fois... Sur des bogues totalement sans rapport ou inexpliqués...
Tu manipules tes données avec des classes Obj-C ou avec des types C ?
Tu utilises une librairie ?
à partir de mon singleton, c'est en C oui...
Oui.. une simple librairie C. ça peut jouer ?
Merci.
Pinus
Tout se passe comme si la 1ere exécution de cette méthode provoquait la disparition de celle-ci ;-) Je suis trop novice pour piger ce qui se passe, mais c'est assez impressionnant: tout se passe très bien lors de la première exécution. Après, il semble que mon instance ne propose plus cette méthode: tout simplement...
Pinus.
Mets ce log :
Dans ta méthode et après le message problématique...
Justement ! c'est ce que je viens de faire :
J'ai placé 2 NSLog, 1 au début de la méthode "-(BOOL)GetColumnListForTable:(NSString *)tableName", et 1 à sa fin (juste avant de retourner le BOOL :
2009-01-03 12:39:27.451 REAL Client[7971:813] 1) Instance Method : 0x16bfd0
2009-01-03 12:39:27.452 REAL Client[7971:813] executing query : PRAGMA table_info(personnes)
2009-01-03 12:39:27.514 REAL Client[7971:813] getting 124 rows
2009-01-03 12:39:27.515 REAL Client[7971:813] 2) Instance Method : 0x0
Donc, au moins, je sais ou ça déconne. Me reste plus qu'à essayer des trucs.
En tout cas, merci bien de m'avoir indiqué "class_getInstanceMethod", car c'est super efficace...
Pinus
donc je dois merdoyer
• En passant la souris tu récupères l'adresse de str
• Fait un clic-droit dans la fenêtre du debugger, et observe la mémoire (suffisamment d'octets)
• Au-delà de str il y a des octets, peut-être sont-ils utilisés à autre chose : une méthode, une référence, une autre variable
• fait step into, continue et clique sur le bouton
Tu vois le bug en temps réel
J'essaie ça tout de suite merci.
Mais on avance !
... j'ai placé ce NSLog après chaque ligne exécutée dans cette méthode, et le coupable est (j'ai honte) :
un strcpy ...
Je souçonne qu'il se prend les pieds dans le tapis en allant taper dans une zone mémoire allouée. Enfin, en bref, je sens bien le coup que tout ça vienne de ma méconnaissance des fonctions C sur les string. Je vais essayer de mieux gérer mes malloc car je sens que c'est de là que vient l'embrouille.
Pinus.
ça y est, c'est trouvé: honte à moi :
Je manipulais tellement de chaà®nes C que je me suis pris les pieds dans le tapis, en faisant un malloc sur le mauvais pointeur, si bien que celui que j'utilisais dans strcpy n'avait pas de mémoire allouée, donc la pioche à mémoire s'est servie, et le reste a déboulé en cascade...
Une vraie honte pour moi. Mais je suis très impressionné de voir les conséquences que cela a pu avoir (disparition d'une méthode d'instance).
Cela va sans dire que votre aide (et votre acharnement a m'aider) m'a été précieuse. Pas tant dans la connerie à l'origine du problème que dans toutes les choses que j'ai pu apprendre au cours de ce pistage.
Merci à tous. Et là , le coup du malloc sur le mauvais pointeur, promis, il va rester gravé !!! Comme l'utilité de la fonction "class_getInstanceMethod" ;-)
Pinus.
Et sans vouloir être méchant, mais pour quand même en remettre une couche... Je soupçonne qu'une mauvaise hygiène de vie concernant le respect des conventions t'as mené à ce genre de résultat... ;D
Ce sont des erreurs difficiles à localiser, car le C étant (très) permissif, l'exécution ne s'arrête pas forcément à l'endroit où il y a erreur.
Pour compléter les bonnes recommandations de Psychoh, j'ajouterais qu'une avance dans un projet en emboà®tant des sous-projets successifs (ou en partitionnant) peut permettre de voir les erreurs à temps . Par exemple, ici faire un sous-projet testant le bon fonctionnement de la lecture de la BDD, en cherchant à le pousser dans ses derniers retranchements, puis un autre sur le bon fonctionnement du singleton, puis l'interface ....
Amen
Oui, en l'occurrence c'est un "malloc" sur le mauvais pointeur. Si ma mémoire est bonne, il s'est agit d'un d'un copier/coller ... Pour ce qui est des conventions, je vais relire le bouquin de Kochan pour bien les imprimer. Merci encore.
Pinus.
En effet. Le projet en question n'est pas un projet de "production", mais juste un projet pour apprendre à développer avec ObjC et Cocoa.. Pour ne voir que le bon coté des choses: j'ai beaucoup appris (grace à vous, il est vrai). Encore merci.
Pinus.