Pb de mémoire:recherche de méthodes [Résolu]

Signaler
Messages postés
11
Date d'inscription
mercredi 14 mars 2007
Statut
Membre
Dernière intervention
20 novembre 2007
-
alexandre7g
Messages postés
11
Date d'inscription
mercredi 14 mars 2007
Statut
Membre
Dernière intervention
20 novembre 2007
-
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

Messages postés
11
Date d'inscription
mercredi 14 mars 2007
Statut
Membre
Dernière intervention
20 novembre 2007

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.
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Montre nous un bout de code, ca pourrait t'aider :)
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
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...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
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.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
On peut voir les vtable en C++ sous VC2005 ?
Je suis passé à côté...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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 :)
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
Ah vi, effectivement, désolé. Ce débugueur est décidement très pratique !
Messages postés
11
Date d'inscription
mercredi 14 mars 2007
Statut
Membre
Dernière intervention
20 novembre 2007

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...
Messages postés
11
Date d'inscription
mercredi 14 mars 2007
Statut
Membre
Dernière intervention
20 novembre 2007

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...
Messages postés
11
Date d'inscription
mercredi 14 mars 2007
Statut
Membre
Dernière intervention
20 novembre 2007

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?