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!

Était-ce utile?

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.

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