Comment déboguer un dépassement de mémoire tampon dans Visual C++ 9?
J'ai un énorme MMC snapin écrit en Visual C++ 9. Chaque fois que dans un certain temps, quand j'appuie sur F5 dans la console MMC mmc.exe se bloque. Si je attacher un débogueur je vois le message suivant:
D'un dépassement de tampon a eu lieu dans mmc.exe qui a corrompu le programme interne de l'état. Appuyez sur Pause pour déboguer le programme ou Continuer pour terminer le programme.
Pour plus de détails, veuillez consulter la rubrique d'Aide "Comment déboguer Dépassement de la mémoire Tampon Problèmes".
Tout d'abord, il n'y a pas Comment déboguer les Problèmes de Saturation de la mémoire Tampon sujet n'importe où.
Quand j'ai inspecter la pile d'appel, je vois que c'est probablement quelque chose avec des cookies de sécurité utilisé pour se prémunir contre la pile de mémoire tampon allouée: les dépassements de
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, mais aucune idée de l'endroit où le dépassement de mémoire tampon peut se produire et pourquoi. J'ai trouvé ce forum de discussion et plus précisément le conseiller à remplacer tous les wcscpy-comme pour les fonctions avec des versions plus sécurisées comme wcscpy_s(). J'ai suivi les conseils et qui n'a pas à me rapprocher de la solution du problème.
Comment corriger mon code et trouver pourquoi et où le dépassement de mémoire tampon se produit avec Visual Studio 2008?
OriginalL'auteur sharptooth | 2010-06-22
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous n'êtes pas en mesure de reproduire ce de manière fiable.
J'ai utilisé avec succès Rationnelle Purifier afin de traquer une variété de problèmes de mémoire dans le passé, mais il en coûte $ et je ne suis pas sûr de savoir comment il serait interagir avec la console MMC.
Sauf si il y a une sorte de mémoire intégrée débogueur, vous pouvez avoir à essayer de résoudre par programmation. Êtes-vous en mesure de supprimer/désactiver les blocs de fonctions pour voir si le problème se manifeste?
Si vous avez des "suppositions" à propos de l'endroit où le problème se produit, vous pouvez essayer de désactiver/modifier le code ainsi. Même si vous avez modifié les fonctions de copie à
_s
versions, vous devez toujours être en mesure de gérer de manière fiable des données tronquées.OriginalL'auteur Mark B
Ajouter /Ccf commutateur de compilateur. Cela permettra de détection des dépassements de la mémoire tampon et les flux de données lors de l'exécution. Lorsque le dépassement sera détecté, le programme va briser exactement à l'endroit où cela s'est passé plutôt que de vous donner des post-mortem message.
Si cela n'aide pas, puis étudier wcscpy_s() appels que vous avez mentionné. Vérifiez que le "nombre d'éléments" a valeur correcte. J'ai récemment fixée de dépassement de mémoire tampon causé une utilisation incorrecte de wcscpy_s(). Voici un exemple:
Avis que le buff + offset a MAXSIZE - décalage éléments, pas MAXSIZE.
OriginalL'auteur Szymon Wybranski
J'ai juste eu ce problème il y a une minute, et j'ai été en mesure de le résoudre. J'ai d'abord cherché sur le net sans succès, mais je suis arrivé à ce thread.
De toute façon, je suis en cours d'exécution VS2005 et j'ai un programme multi-threadé. J'ai eu à "deviner" le thread qui a causé le problème, mais heureusement, je n'ai que quelques.
Donc, ce que j'ai fait dans ce thread, j'ai couru à travers le débogueur, pas à pas à travers le code à un haut niveau de fonction. J'ai remarqué qu'il a toujours lieu au même endroit, dans la fonction, de sorte il était maintenant question de forage vers le bas.
L'autre chose que je tiens à faire un pas de travers avec la pile des appels de la fenêtre ouvrir s'assurer que la pile regardais bien et juste de noter lorsque la pile se détraque.
J'ai finalement réduit à la ligne qui a provoqué le bug, mais il n'était pas réellement que ligne. C'était la ligne avant.
Quelle a donc été la cause pour moi? Ainsi, dans le court-parler, j'ai essayé de memcpy un pointeur NULL dans un valide zone de la mémoire.
Je suis surpris de la VS2005 ne pouvez pas gérer cela.
De toute façon, espérons que cette aide. Bonne chance.
OriginalL'auteur Toy Yoda
J'ai eu ce envahie quand j'ai voulu pour incrémenter une valeur à un pointeur de variable comme ceci:
*out_BMask++;
au lieu de cela
(*out_BMask)++;
où out_BMask a été déclaré comme
int *out_BMask
Si vous avez fait quelque chose comme moi, alors j'espère que cela va vous aider 😉
OriginalL'auteur Martin Krajčírovič