Débogage Visual C ++ problèmes d'allocation de mémoire
-
13-09-2019 - |
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?
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.