2008-12-18 6 views
3

J'ai une application que je suis en train de déboguer un accident dans Cependant, il est difficile de détecter le problème pour quelques raisons.Comment diagnostiquer une violation d'accès à la sortie de l'application

  • L'accident se produit à arrêt, ce qui signifie le code incriminé n'est pas sur la pile
  • l'accident ne se produit que dans la version builds, symboles qui signifie ne sont pas disponibles

par accident, je veux dire l'exception suivante:

0xC0000005: Access violation reading location 0x00000000. 

Quelle stratégie utiliseriez-vous pour diagnostiquer ce problème?

Ce que j'ai fait jusqu'ici est de supprimer autant de code de mon programme jusqu'à ce que j'obtienne le minimum qui causera le crash. Il semble que cela se passe dans un code qui est lié de façon statique au projet, donc cela n'aide pas non plus.

Répondre

5

Vous pouvez créer les fichiers de symboles même pour la version finale. Pour ce faire, exécutez votre programme, attachez le débogueur, fermez-le, et voyez la cause de l'accident dans le débogueur.

+0

L'option est appelée "Générer des informations de débogage" dans l'onglet lien de Visual C++ 6. – FryGuy

1

Vous semblez avoir quelque chose qui lit un pointeur nul - jamais bon.

Je ne sais pas sur quelle plate-forme vous êtes. Sous Linux, vous pouvez utiliser valgrind.

Ce qui est différent de votre version builds de votre debug en dehors de la présence ou l'absence d'informations de débogage?

Pouvez-vous construit le code lié statiquement avec des informations de débogage en elle? Pouvez-vous obtenir une version de débogage du code lié statiquement?

+0

C'est Windows utilisant WTL. Le code lié statiquement est le nôtre, et oui je peux en créer une version de débogage. – FryGuy

+0

Lorsque j'ai cliqué sur la balise WTL, j'ai trouvé que tout était lié à Windows ... Êtes-vous sûr que vous ne pouvez pas obtenir un plantage de la version de débogage complète? –

1

La stratégie que j'utiliserais est exactement ce que vous avez fait. Supprimez autant de code que possible jusqu'à ce que le problème disparaisse, puis ajoutez ce dernier bit et corrigez-le.

Cependant, il ne peut pas être votre code qui est en faute. Une chose à surveiller - nous avons trouvé ce problème sur AIX et, même si vous utilisez Windows, il peut être similaire.

Nous avions une bibliothèque tierce partie qui a chargé dynamiquement une autre bibliothèque qui, dans sa routine d'initialisation, mis en place une fonction atexit être appelée lorsque le processus se termine. Cependant, comme notre application charge et décharge ces bibliothèques partagées, au moment où le processus s'est terminé, la fonction atexit de la bibliothèque partagée n'était plus en mémoire et nous avons supprimé core.

Cela apparaît comme une violation d'accès après le retour de main() alors, si c'est ce qui vous arrive, c'est presque certainement le même genre de chose. Le code de démarrage C RTL parcourt la liste atexit et appelle chacune de ses fonctions, peu importe ce que vous avez fait avec eux.

Bien sûr, si elle est avant de s'écraser les sorties principales(), alors c'est un point discutable. Une chose que vous pourriez considérer (et nous l'avons fait en une occasion après une analyse coût/bénéfice de traquer et de corriger un bug particulièrement épineux): envoyer la version de débogage comme votre produit.Si ce n'est pas le cas, cela peut être une solution rapide pour obtenir le produit pendant que vous travaillez sur une solution plus acceptable à votre guise.

+0

Intéressant! –

+1

Nare dans l'esprit que vous pouvez enfreindre les accords de licence si vous commencez à distribuer des dll d'exécution de débogage. Vous n'êtes pas censé distribuer les versions de débogage de l'exécution MFC par exemple –

Questions connexes