2011-11-18 12 views
5

Czy ktoś wie, czy istnieje ograniczenie liczby bibliotek DLL, które może zobaczyć program WinDbg? Uważam, że Visual Studio było ograniczone do 500, ale nie mogę znaleźć źródła tego roszczenia poza niektórymi kontami używanymi w pracy.Czy istnieje ograniczenie liczby modułów, które może zobaczyć WinDbg?

Próbuję debugować scenariusz włochaty i ślad stosu WinDbg jest niekompletny. Według Process Explorer moduł, który mnie interesuje jest załadowany, ale nie pojawia się w wynikach polecenia 'lm' w WinDbg.

Podejrzane, że dane wyjściowe mają dokładnie 500 modułów długości, mimo że wiem, że jest ich dużo więcej, co prowadzi do przekonania, że ​​WinDbg nie widzi bibliotek DLL powyżej pierwszej 500. Czy ktoś może to potwierdzić? Lub zasugerować inny powód, dla którego załadowany moduł może nie pojawić się w "lm"?


Edit: Po dalszych badaniach, udało mi się dostać WinDbg załadować zajrzyj do modułu, co potrzebne, dołączając debugger wcześniej, zanim że moduł został załadowany.

Wydaje mi się, że po dołączeniu do procesu silnik debuggera zobaczy tylko pierwsze 500 bibliotek DLL, ale poprawnie przetworzy kolejne ładunki. Wciąż by mi się podobało potwierdzenie od eksperta WinDbg, ale jeszcze lepiej, obejście do przetworzenia ponad 500 modułów podczas dołączania!

+0

Miałem to również. Wydaje się być ograniczeniem interfejsów API debugowania MS ogólnie. Visual Studio wyświetla to samo ograniczenie. –

Odpowiedz

3

Wygasło, że z powodu korupcji na liście modułów windbg nie wyświetlił wszystkich modułów. Oto skrypt (znajdujący się w pliku pomocy Windbg), którego użyłem w 32 bitach xp userdumps. podczas polowania na moduły nie znalezione w wyjściu lm. Możesz również wypróbować biblioteki dll w 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

Jest registry key kontrolując liczbę wiadomości debugger debugger widać. Po zwiększeniu wartości do np. 2048 widać wszystkie załadowane biblioteki dll.

Oto odpowiedni przycisk:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager,

DWORD DebuggerMaxModuleMsgs = przykład 2048

Powiązane problemy