Domanda

Mi sto divertendo molto a rintracciare un po 'di corruzione dell'heap. Ho abilitato la verifica dell'heap di pagina standard con

gflags /p /enable myprogram.exe

e questo riesce a confermare la corruzione:

===========================================================
VERIFIER STOP 00000008: pid 0x1040: corrupted suffix pattern 

    10C61000 : Heap handle
    19BE0CF8 : Heap block
    00000010 : Block size
    00000000 : 
===========================================================

Quando accendo la verifica dell'heap a pagina intera ( gflags / p / enable myprogram.exe / full ) in previsione che ciò causi un errore nel momento in cui viene introdotta la corruzione, ottengo niente di più.

Ho iniziato a sperare mentre leggevo Debug avanzato di Windows: danneggiamento della memoria Parte II — Heaps , che è un capitolo di Debug avanzato di Windows . Ho installato WinDbg e scaricato i simboli di debug per user32.dll , kernel32.dll , ntdll.dll secondo http://support.microsoft.com/kb/311503 . Ora, quando il programma si arresta nel debugger, posso emettere questo comando per visualizzare informazioni sulla pagina heap:

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

Sono sconcertato dalla traccia dello stack (null) . Ora, http://msdn.microsoft.com/ en-us / library / ms220938% 28VS.80% 29.aspx dice:

  

Il campo StackTrace non conterrà sempre un valore non nullo per vari motivi. Innanzitutto il rilevamento della traccia dello stack è supportato solo su piattaforme x86 e, in secondo luogo, anche sulle macchine x86 gli algoritmi di rilevamento della traccia dello stack non sono completamente affidabili. Se il blocco è un blocco allocato, la traccia dello stack è per il momento di allocazione. Se il blocco è stato liberato, la traccia dello stack è per il momento libero.

Ma mi chiedo se qualcuno abbia qualche idea su come aumentare le possibilità di vedere lo stack traccia dal momento dell'allocazione.

Grazie per aver letto!

È stato utile?

Soluzione

Ah ah! Ho scoperto che dovevo abilitare più opzioni gflags :

gflags /i myprogram.exe +ust

Che ha questo effetto:

ust - Create user mode stack trace database

Sembra semplice quando vedo la descrizione del parametro. Sciocco me Ma sembra anche che sia necessario impostare le dimensioni del database di traccia prima che abbia effetto:

gflags /i myprogram.exe /tracedb 512

... o qualsiasi altra cosa (in MB).

Altri suggerimenti

Secondo Microsoft, la funzione malloc nel modulo C run-time (CRT) utilizza l'omissione del puntatore al frame (FPO) in alcune versioni di Windows. Potresti non visualizzare le informazioni complete sullo stack della funzione malloc. (Http://support.microsoft.com/kb/268343)

Se possibile, prova a collegare la versione di debug CRT, ad es. collegamento con l'opzione / MDd, per risolvere questo problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top