Question

Je suis le débogage d'un logiciel qui se bloque finalement avec l'un des messages suivants:

1. DAMAGE: after normal block (#24729280) at 0x00D710E0
2. Debug Assertion Failed
   Program: D:\Soft\Test.exe
   File: dbgheap.c
   Line: 1017

   Expression: _BLOCK_TYPE_IS_VALID(phead->nBlockUse)

Ce logiciel est vraiment vieux, mais le changer est maintenant pas une option. Il est écrit sur Visual C ++ 6.0. Nous devinons c'est une sorte de dépassement de mémoire tampon, donc nous essayons de trouver des moyens pour détecter où il se produit.

J'ai trouvé des informations sur PageHeap (ce qui semble être en mesure de me dire ce que je veux) et GFlags , mais il semble que je ne peux pas le faire fonctionner.

J'ai créé un programme de test:

char* test;
test = new char[5];
test[5] = 'a';
delete[] test;

ce qui soulève une erreur:

DAMAGE: after normal block (#55) at 0x1671920

Alors, j'ai essayé de fixer PageHeap en exécutant:

gflags.exe /p /enable MemoryTest.exe /full

et en relançant ensuite (à la fois via Visual Interface C ++ 6.0 et par l'explorateur Windows), ce qui a donné lieu à la même erreur.

Alors j'ai essayé de compiler la version, et il a couru à travers l'interface Visual C ++ 6.0 pour obtenir l'erreur:

User breakpoint called from code at 0x7c90120e

Et depuis l'explorateur windows, je viens de recevoir la fenêtre de dialogue me demandant d'envoyer un rapport d'erreur.

Qu'est-ce que je suis absent?

Était-ce utile?

La solution

Vous pouvez exécuter l'application en mode release en attachant Windbg .

  • Activer la gflags (Comme vous mentionné)
  • Lancez l'application dans la version le mode.
  • Attachez-le à Windbg en utilisant l'option Attach to process dans Windbg.
  • Configurer le bon chemin pour libérer PDB.
  • Recharger le PDB manuellement à l'aide .reload /f automatique en cas de échoue le chargement.
  • Effectuer le cas d'utilisation.

WinDbg serait arrêter l'exécution à chaque fois qu'une exception se produit. Pour chaque exception de première chance, analyser les raisons. Il pourrait être l'une de l'erreur de l'accident.

Autres conseils

Avant d'utiliser gflags / PageHeap Je vous suggère de vérifier si des exceptions de violation d'accès. Fixez d'abord le processus en utilisant Build-> Démarrer Debug-> Joindre à l'option du processus. Une fois qu'il est fixé activer l'exception de violation d'accès en allant à Debug-> Exceptions sélectionnez Violation d'accès et sélectionnez la case à cocher Arrêter toujours. Ensuite, vérifiez si votre débogueur attrape toutes les exceptions de violation d'accès.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top