2011-11-18 6 views
5

Qualcuno sa se c'è un limite sul numero di DLL che WinDbg può vedere? Credo che Visual Studio sia stato limitato a 500, ma non riesco a trovare una fonte per questo reclamo al di fuori di alcuni account di seconda mano sul posto di lavoro.C'è un limite al numero di moduli che WinDbg può vedere?

Sto tentando di eseguire il debug di uno scenario peloso e la traccia di stack di WinDbg è incompleta. Secondo Process Explorer, il modulo che mi interessa è caricato ma non appare nell'output di 'lm' in WinDbg.

Sospettosamente, detto output è esattamente lungo 500 moduli, anche se so che ce ne sono molti di più caricati, portandomi a credere che WinDbg non stia vedendo DLL oltre i primi 500. Qualcuno può confermare? Oppure suggerisci qualche altro motivo per cui un modulo caricato potrebbe non apparire in "lm"?


Edit: su ulteriori indagini, sono stato in grado di ottenere WinDbg per caricare vedere il modulo di cui avevo bisogno allegando il debugger in precedenza, prima di tale modulo è stato caricato.

Mi sembra che, una volta collegato a un processo, il motore di debug visualizzerà solo le prime 500 DLL ma elaborerà correttamente i carichi successivi. Mi piacerebbe comunque avere la conferma da un esperto di WinDbg, o meglio ancora, un bypass per elaborare più di 500 moduli durante il collegamento!

+0

Ho avuto anche questo. Sembra essere una limitazione delle API di debug di MS in generale. Visual Studio mostra la stessa limitazione. –

risposta

3

Sono scaduto che a causa di danneggiamento nella lista dei moduli windbg non ha visualizzato tutti i moduli. Ecco uno script (che si trova nel file della guida di Windbg) che ho usato su userdump xp a 32 bit. durante la ricerca di moduli non trovati nell'output di lm. Puoi anche provare le! Dll in windbg.

$$ run with: $$>< C:\DbgScripts\walkLdr.txt 
    $$ 
    $$ Get module list LIST_ENTRY in $t0. 
    r? $t0 = &@$peb->Ldr->InLoadOrderModuleList 
    $$ Iterate over all modules in list. 
    .for (r? $t1 = *(ntdll!_LDR_DATA_TABLE_ENTRY**)@$t0; 
      (@$t1 != 0) & (@$t1 != @$t0); 
      r? $t1 = (ntdll!_LDR_DATA_TABLE_ENTRY*)@$t1->InLoadOrderLinks.Flink) 
    { 
     $$ Get base address in $Base. 
     as /x ${/v:$Base} @@c++(@$t1->DllBase) 

     $$ Get full name into $Mod. 
     as /msu ${/v:$Mod} @@c++(&@$t1->FullDllName) 

     .block 
     { 
      .echo ${$Mod} at ${$Base} 
     } 
     ad ${/v:$Base} 
     ad ${/v:$Mod} 
    } 
3

C'è un registry key controllare il numero di messaggi di debug un debugger può vedere. Quando si aumenta il valore a es. 2048 puoi vedere tutte le DLL caricate.

Ecco il tasto corrispondente:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager

DebuggerMaxModuleMsgs DWORD = esempio 2048