2011-04-18 1 views
0

J'ai une application Windows, il se bloque de temps en temps et non reroducibly. Quand c'est le cas, j'obtiens une fonction virtuelle pure appelée. Je l'ai mis en place pour créer un vidage Windows en utilisant ADplus et même quand il se bloque, il n'y a jamais un vidage.application Windows s'écraser avec appel de fonction virtuelle pure

Je suis assez sûr que c'est une erreur de construction, je construis avec VC2008 SP1 et c'est la version de construction.

Des idées à ce sujet? Comment puis-je déboguer cela, c'est une version de construction avec le fichier .pdb et le fichier de carte.

Merci Reza

Répondre

2

Comme cela a déjà été souligné, il est très peu probable qu'il s'agisse d'une erreur de construction. J'ai eu un projet assez complexe avec un problème similaire et j'ai pu le retrouver en utilisant _set_purecall_handler et en fournissant mon propre gestionnaire. De cette façon, j'ai été capable de percer dans le débogueur quand c'est arrivé et voir la pile d'appels. Évidemment, une alternative ici est de créer le minidump quand cela arrive. Rappelez-vous que vous devez tout préparer pour le minidump avant le le programme rencontre une exception.

Cependant, il y a également de bonnes chances que cela puisse être causé par une corruption de tas. Dans un tel cas, je m'attendrais à une variété de symptômes, cependant. Vous décrivez ce symptôme spécifique, il est donc probable que votre code soit en cause. Le projet que j'ai mentionné ci-dessus était un projet hérité qui modélisait quelque chose de similaire à COM et il y avait en effet des endroits où le compilateur n'aurait pu trouver toutes les occasions de fonctions virtuelles pures pour lesquelles aucune implémentation n'existait dans les classes dérivées.

+0

quand vous dites préparer tout pour un minidump, que faire? – reza

+0

@reza: assurez-vous que 'dbghelp.dll' est chargé et que tous les pointeurs de fonction ont été récupérés (btw, ne pas charger c'est la raison la plus fréquente pour laquelle aucun fichier de vidage n'est créé - souvent parce qu'aucune version récente de la DLL n'existe sur le système). Aussi, préparez un nom pour cela. Toutes les opérations que vous tentez lorsque l'application est "suspendue" (c'est-à-dire instable) peuvent être potentiellement fatales. Par conséquent, essayez de faire toutes les choses pertinentes avant que votre gestionnaire d'exception ou votre gestionnaire de fonction virtuelle pur soit appelé et soit supposé créer le fichier de vidage. – 0xC0000022L

2

Tout d'abord, assurez-vous que vous n'êtes pas calling pure virtual function. Si ce n'est pas le cas, essayez de démarrer votre programme sous WinDbg.

+0

+ 1 pour suggestion de démarrer sous WinDbg –

+0

c'est un service NT, comment ferais-je cela? – reza

+1

@reza, voici la réponse: [Comment déboguer les services Windows] (http://support.microsoft.com/kb/824344/fr-fr) –

0

Si votre problème est pas constant le plus probablement il y a des problèmes avec de l'indice écrit qui pourrait corrompre la mémoire

+2

"Je ne pense pas que vous pouvez déboguer une version finale." Bien sûr vous pouvez. Pourquoi penseriez-vous cela? –

+0

comment devrais-je déboguer une version release, j'ai des fichiers pdb et des fichiers de carte. – reza

1

Je suis assez sûr que ce soit construire erreur

Très, très un probable. Il est beaucoup plus probable que ce soit un bug dans votre code.

Vous pourriez être slicing an object quelque part. Si vous avez configuré votre application pour générer un fichier dump sur unhanded exceptions et que vous êtes encore en train de mourir sans fichier de vidage, il est très possible que le bogue se trouve dans le gestionnaire d'exceptions.

Vous devez obtenir un fichier de vidage. Cela devrait être votre première priorité.

0

Si vous avez essayé une reconstruction complète, il semble plus probable que ce soit un problème de codage.

Appelez-vous des fonctions virtuelles (pures) dans n'importe quel constructeur ou destructeur?

Il est plus probable que vous appeliez une fonction virtuelle pure sur un objet supprimé et que vtable a été déplacé pour pointer vers l'objet parent. Dans ce cas, valgrind (gratuit, Linux) ou Purify ($$$, Windows) sera vraiment en mesure de vous aider. VS peut aussi avoir un vérificateur de mémoire.

+0

Application Verifier peut vous aider si l'application a été créée de telle sorte que le vérificateur de tas puisse voir les problèmes. – 0xC0000022L

+0

Qu'est-ce qu'un vérificateur d'application? – reza

0

J'ai déjà eu un problème similaire avec C++.J'ai eu un appel à une fonction virtuelle d'un constructeur quelque part, donc l'objet n'a pas encore été construit quand l'appel s'est passé, expliquant la fonction virtuelle "pure" appelée. Il peut également s'agir d'un problème de tranchant si vous avez des lancers défectueux sur des objets au lieu d'un pointeur vers des objets. Utilisez un débogueur et étape par étape/backtrace pour trouver la source afin que nous puissions vous aider à mieux.

0

J'ai la même erreur. J'ai passé en revue le code plusieurs fois et n'ai jamais trouvé l'utilisation de fonctions virtuelles dans les constructeurs ou les destructeurs. Le problème était dans le système de construction. J'avais une ancienne version de bibliothèque statique sur mon ordinateur où certaines fonctions n'étaient pas purement virtuelles, et une nouvelle version quand elle est devenue (j'ai ajouté une couche d'abstraction supplémentaire). Parce que le fichier EXE a été créé avec l'ancienne bibliothèque statique, mais de nouveaux en-têtes, cette erreur est apparue. Donc, assurez-vous que vos bibliothèques et inclure les versions des fichiers sont cohérentes si rien d'autre ne vous aide.

Questions connexes