alexandre7g
Messages postés11Date d'inscriptionmercredi 14 mars 2007StatutMembreDernière intervention20 novembre 2007
-
2 août 2007 à 17:43
alexandre7g
Messages postés11Date d'inscriptionmercredi 14 mars 2007StatutMembreDernière intervention20 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?
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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...
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 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 :)
alexandre7g
Messages postés11Date d'inscriptionmercredi 14 mars 2007StatutMembreDernière intervention20 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...
alexandre7g
Messages postés11Date d'inscriptionmercredi 14 mars 2007StatutMembreDernière intervention20 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...
alexandre7g
Messages postés11Date d'inscriptionmercredi 14 mars 2007StatutMembreDernière intervention20 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?