2010-06-22 5 views
2

J'ai un énorme snapin MMC écrit en Visual C++ 9. Chaque fois que je tape F5 dans MMC mmc.exe se bloque. Si je lui attache un débogueur, je vois le message suivant:Comment déboguer un dépassement de tampon dans Visual C++ 9?

Un débordement de tampon s'est produit dans mmc.exe qui a corrompu l'état interne du programme. Appuyez sur Pause pour déboguer le programme ou sur Continuer pour terminer le programme.

Pour plus de détails, veuillez consulter la rubrique d'aide 'Comment déboguer les problèmes de dépassement de tampon'.

Tout d'abord, il n'y a pas Comment déboguer sujet tampon Débordement Problèmes partout.

Lorsque je visite la pile d'appel, je vois qu'il est probablement quelque chose avec les cookies de sécurité utilisés pour se prémunir contre les dépassements de mémoire tampon pile allouée:

MySnapin.dll!__crt_debugger_hook() Unknown 
MySnapin.dll!__report_gsfailure() Line 315 + 0x7 bytes C 
mssvcr90d.dll!ValidateLocalCookies(void (unsigned int)* CookieCheckFunction=0x1014e2e3, _EH4_SCOPETABLE * ScopeTable=0x10493e48, char * FramePointer=0x0007ebf8) + 0x57 bytes C 
msvcr90d.dll!_except_handler4_common(unsigned int * CookiePointer=0x104bdcc8, void (unsigned int)* CookieCheckFunction=0x1014e2e3, _EXCEPTION_RECORD * ExceptionRecord=0x0007e764, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame=0x0007ebe8, _CONTEXT * ContextRecord=0x0007e780, void * DispatcherContext=0x0007e738) + 0x44 bytes C 
MySnapin.dll!_except_handler4(_EXCEPTION_RECORD * ExceptionRecord=0x0007e764, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame=0x0007ebe8, _CONTEXT * ContextRecord=0x0007e780, void * DispatcherContext=0x0007e738) + 0x24 bytes C 
ntdll.dll!7c9032a8()  
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!7c90327a()  
ntdll.dll!7c92aa0f()  
ntdll.dll!7c90e48a()  
MySnapin.dll!IComponentImpl<CMySnapin>::GetDisplayInfo(_RESULTDATAITEM * pResultDataItem=0x0007edb0) Line 777 + 0x14 bytes C++ 
// more Win32 libraries functions follow 

J'ai beaucoup de code et aucune idée d'où le dépassement de la mémoire tampon peut se produire et pourquoi. J'ai trouvé this forum discussion et en particulier le conseil de remplacer toutes les fonctions de type wcscpy avec des versions plus sécurisées comme wcscpy_s(). J'ai suivi le conseil et cela ne m'a pas rapproché de la solution du problème. Comment puis-je déboguer mon code et trouver pourquoi et où le dépassement de tampon se produit avec Visual Studio 2008?

Comment?

Répondre

1

Je suppose que vous n'êtes pas capable de reproduire cela de manière fiable. J'ai utilisé avec succès Rational Purify pour traquer divers problèmes de mémoire par le passé, mais cela coûte $ et je ne sais pas comment il interagirait avec MMC.

À moins d'avoir un débogueur de mémoire intégré, vous devrez peut-être essayer de le résoudre par programmation. Êtes-vous capable de supprimer/désactiver des blocs de fonctionnalités pour voir si le problème se manifeste?

Si vous avez des «suppositions» sur l'origine du problème, vous pouvez également essayer de désactiver/modifier ce code. Même si vous avez modifié les fonctions de copie en versions _s, vous devez toujours être en mesure de gérer de façon fiable les données tronquées.

2

J'ai juste eu ce problème il y a une minute, et j'ai été capable de le résoudre. J'ai cherché d'abord sur le net sans succès, mais je suis arrivé à ce fil.

De toute façon, je cours VS2005 et j'ai un programme multi-thread. J'ai dû deviner quel fil a causé le problème, mais heureusement, j'en ai seulement quelques-uns. Donc, ce que j'ai fait dans ce thread, j'ai couru à travers le débogueur, en passant par le code à une fonction de haut niveau. J'ai remarqué que cela se produisait toujours au même endroit dans la fonction, alors maintenant il s'agissait de forer.

L'autre chose que je ferais est de passer à travers avec la fenêtre callstack ouverte en s'assurant que la pile a l'air bien et en notant juste quand la pile devient haywire.

Je me suis finalement rétréci jusqu'à la ligne qui a causé le bogue, mais ce n'était pas vraiment cette ligne. C'était la ligne avant.

Alors, quelle était la cause pour moi? Eh bien, en bref, j'ai essayé de mémcpy un pointeur NULL dans une zone valide de la mémoire.

Je suis surpris que le VS2005 ne puisse pas gérer cela.

Quoi qu'il en soit, espérons que cela aide. Bonne chance.

5

Ajouter /RTCs basculez vers le compilateur. Cela permettra la détection des dépassements de tampon et des sous-exécutions lors de l'exécution. Lorsque le dépassement sera détecté, le programme se cassera exactement là où c'est arrivé plutôt que de vous donner un message post-mortem.

Si cela ne vous aide pas, examinez wcscpy_s() appels que vous avez mentionnés. Vérifiez que le 'nombre d'éléments' a une valeur correcte. J'ai récemment corrigé le dépassement de la mémoire tampon causé une utilisation incorrecte de wcscpy_s(). Voici un exemple:

const int offset = 10; 
wchar_t buff[MAXSIZE]; 
wcscpy_s(buff + offset, MAXSIZE, buff2); 

Notez que buff + offset a des éléments MAXSIZE - offset, pas MAXSIZE.

+0

Merci beaucoup d'avoir choisi cet interrupteur/RTC! M'a sauvé beaucoup de temps. – Trass3r

0

J'ai ce dépassement quand je voulais augmenter une valeur dans une variable pointeur comme ceci:

*out_BMask++;
au lieu
(*out_BMask)++;

où out_BMask a été déclarée comme int *out_BMask
Si vous avez fait quelque chose comme moi alors j'espère que cela vous aidera;)

Questions connexes