Pb de mémoire:recherche de méthodes

Résolu
alexandre7g Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 20 novembre 2007 - 2 août 2007 à 17:43
alexandre7g Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 20 novembre 2007 - 6 août 2007 à 17:37
Bonjour,

Je programme en C++ sous VS2005.
J'ai un pb d'allocation de ma table des méthodes (il me semble):lorsque j'appel un méthode depuis un pointeur vers un objet, le programme se dirige vers une AUTRE méthode!!!
Elle n'ont aucun rapport entre elles (nom,pas d'héritage,...).
Le programme m'a fait cette erreur a 2 endroits différents dans le code.

Problèmes de heap?
Comment débugger?
Puis je voir l'adresse des méthodes qlq part?

12 réponses

alexandre7g Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 20 novembre 2007
6 août 2007 à 17:37
Merci pour ceux qui m'ont aiguillés,
le problème venait d'une succession de 'cast' sur un objet (template en plus!).

En gros le débogueur se plantait completement et jusqu'à tapé dans de la mémoire non accessible.
3
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
3 août 2007 à 00:57
Montre nous un bout de code, ca pourrait t'aider :)
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 août 2007 à 13:27
Salut,

lol le bug à la c**.

Les méthodes qui posent problèmes sont déclarées virtuelles dans une parente ?

Le principe des vtable est généralement assez simple : chaque instance de l'objet balade un pointeur sur une vtable qui est utilisée par toutes les instances d'une classe. Lors de l'appel d'une méthode, le processeur execute l'adresse qui se trouve à un certains offset dans la vtable pointé par l'objet.

|pointeur sur l'objet -> |vtable -> adresse de la fonction à executer.
|offset dans la vtable |offset dans la vtable

Débuguer en langage machine te permettrait de comprendre d'où vient le problème. L'assembleur est un langage très simple, mais c'est vrai que pour celui qui en a jamais fait...
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
3 août 2007 à 14:18
Euh rt15 il semble justement que dans son cas, il n'y ait aucun héritage.
Débugger en langage machine ? alors qu'on peu débugger en C ?

A tout hasard Alexande, tente un clean + build.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 août 2007 à 15:38
Je pensais que le "pas d'héritage" était en relation avec le "Elle n'ont aucun rapport entre elles".

S'il n'y a pas du tout d'héritage, il n'y a très certainement pas de vtable dans l'appli.

En langage machine, on ne peut voir le pointeur sur la vtable et la vtable... en C++ non.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
3 août 2007 à 16:20
Bien sur qu'on peut avoir accès a la vtable en C++. Le C est très proche du langage machine. Aucune raison de se faire ù*"'ù(" avec de l'asm ou autre.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 août 2007 à 16:45
On peut voir les vtable en C++ sous VC2005 ?
Je suis passé à côté...
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
3 août 2007 à 19:40
En VC2005 ou n'importe quelle ide, comme tu le disais c'est juste un pointeur possédé par chaque object de la classe. Suffit de lire le contenu du pointeur. Mais le débuggeur VC2005 le fait pour nous. Rien n'est impossible à ce débuggeur :)
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 août 2007 à 20:57
Ah vi, effectivement, désolé. Ce débugueur est décidement très pratique !
0
alexandre7g Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 20 novembre 2007
6 août 2007 à 09:15
Ces réponses m'aident à comprendre le fonctionnement des vtable mais...

En enlevant la méthode vers laquelle le programme pointait de maniere non désiré, une autre erreur est apparu: "Accès violation reading...0xC0000005"!
Ca peu effectivement arriver à n'importe quel moment dans le débogage, en fait à chaque fois que j'arrive à cette adresse (0xC0000005).
J'ai trouvé plusieurs raison à cette "fuite mémoire" ou "refus d'accès" sur le net mais pour l'instant aucune solution à mon problème!
On trouve notament sur internet cette erreur due aux antivirus, au mode débogue, au multithread...
0
alexandre7g Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 20 novembre 2007
6 août 2007 à 10:13
En fait si!

Les 2 problèmes ont l'air d'etre liés (vtable et 0xc0000005): le programme ne trouve pas les méthodes désirés dans la vtable donc pointe n'importe où!
On peut accéder à cette table de méthode sous VS2005 en mode débogue via le pointeur _vfptr (en mettant le curseur de la souris sur un objet possédant des méthodes).
Je tiens ma piste...
0
alexandre7g Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 20 novembre 2007
6 août 2007 à 14:38
Maintenant que je peut voir la vtable, je m'apercois qu'il y manque des méthodes.
De plus certaines sont précédées de [thunk] et le compilo n'a pas l'air de les trouver. Quelqu'un sait ce que cela veut dire? Comment y remédier?
0
Rejoignez-nous