Comment éviter StackTrace “(null)” dans DPH_BLOCK_INFORMATION?
Question
Je m'amuse beaucoup à traquer une corruption de tas. J'ai activé la vérification de tas de pages standard avec
gflags /p /enable myprogram.exe
et cela réussit à confirmer la corruption:
=========================================================== VERIFIER STOP 00000008: pid 0x1040: corrupted suffix pattern 10C61000 : Heap handle 19BE0CF8 : Heap block 00000010 : Block size 00000000 : ===========================================================
Lorsque j'active la vérification de tas de page entière ( gflags / p / enable myprogram.exe / full
), cela entraînera une erreur lors de l'introduction de la corruption, rien de plus.
J'ai commencé à espérer en lisant Débogage avancé sous Windows: corruption de mémoire Partie II & # 8212; Heaps , qui constitue un chapitre de Débogage avancé sous Windows . J'ai installé WinDbg et téléchargé les symboles de débogage pour user32.dll
, kernel32.dll
, ntdll.dll
selon http://support.microsoft.com/kb/311503 . Maintenant, lorsque le programme s’arrête dans le débogueur, je peux exécuter cette commande pour afficher des informations sur la page de tas:
0:000> dt _DPH_BLOCK_INFORMATION 19BE0CF8-0x20 ntdll!_DPH_BLOCK_INFORMATION +0x000 StartStamp : 0xabcdaaaa +0x004 Heap : 0x90c61000 +0x008 RequestedSize : 0x10 +0x00c ActualSize : 0x38 +0x010 FreeQueue : _LIST_ENTRY [ 0x0 - 0x0 ] +0x010 TraceIndex : 0 +0x018 StackTrace : (null) +0x01c EndStamp : 0xdcbaaaaa
Je suis consterné par la trace de pile (null)
. http://msdn.microsoft.com/ en-us / library / ms220938% 28VS.80% 29.aspx dit:
Le champ StackTrace ne contiendra pas toujours une valeur non nulle pour diverses raisons. Tout d'abord, la détection de trace de pile n'est prise en charge que sur les plates-formes x86 et, deuxièmement, même sur les machines x86, les algorithmes de détection de trace de pile ne sont pas complètement fiables. Si le bloc est un bloc alloué, la trace de la pile correspond au moment de l'allocation. Si le bloc a été libéré, la trace de la pile correspond au moment disponible.
Mais je me demande si quelqu'un a des idées pour augmenter les chances de voir la trace de la pile à partir du moment de l'allocation.
Merci d'avoir lu!
La solution
Ah ah! Il me fallait pour activer plus d'options gflags
:
gflags /i myprogram.exe +ust
Qui a cet effet:
ust - Create user mode stack trace database
semble simple quand je vois la description du paramètre. Que je suis bête. Mais il semble également que je doive définir la taille de la base de données de suivi avant qu'elle ne prenne effet:
gflags /i myprogram.exe /tracedb 512
... ou peu importe (en Mo).
Autres conseils
Selon Microsoft, la fonction malloc du module d’exécution C (CRT) utilise l’omission de pointeur de trame (FPO) dans certaines versions de Windows. Vous pouvez ne pas voir les informations complètes de pile de la fonction malloc. (http://support.microsoft.com/kb/268343)
Si possible, essayez de lier la version CRT de débogage, par exemple. lien avec l'option / MDd, pour résoudre ce problème.