2011-11-18 25 views
5

¿Alguien sabe si hay un límite en la cantidad de archivos DLL que WinDbg puede ver? Creo que Visual Studio una vez fue limitado a 500, pero no puedo encontrar una fuente para este reclamo fuera de algunas cuentas de segunda mano en el trabajo.¿Hay un límite en la cantidad de módulos que WinDbg puede ver?

Estoy intentando depurar una situación peliaguda y el seguimiento de pila de WinDbg está incompleto. De acuerdo con Process Explorer, el módulo que me interesa está cargado pero no aparece en la salida de 'lm' en WinDbg.

Sospechoso, dicho resultado tiene exactamente 500 módulos, aunque sé que hay muchos más que eso cargados, lo que me lleva a pensar que WinDbg no está viendo archivos DLL más allá de los primeros 500. ¿Alguien puede confirmarlo? ¿O sugerir alguna otra razón por la cual un módulo cargado podría no aparecer en 'lm'?


Edición: tras una investigación complementaria, yo era capaz de conseguir WinDbg para cargar ver el módulo que necesitaba uniendo el depurador antes, antes de que el módulo se ha cargado.

Me parece que, al realizar un proceso, el motor del depurador solo verá los primeros 500 dlls pero procesará las cargas subsiguientes correctamente. Todavía me encantaría la confirmación por parte de un experto en WinDbg, o mejor aún, ¡un bypass para procesar más de 500 módulos cuando se adjunte!

+0

Tuve esto también. Parece ser una limitación de las API de depuración de MS en general. Visual Studio muestra la misma limitación. –

Respuesta

3

He expirado que debido a daños en la lista de módulos windbg no ha mostrado todos los módulos. Aquí hay una secuencia de comandos (que se encuentra en el archivo de ayuda de Windbg) que he utilizado en userdumps de 32 bits xp. al buscar módulos que no se encuentran en la salida de lm. También puedes probar los! Dlls en 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

Hay una registry key controlar el número de mensajes del depurador a un depurador puede ver. Cuando aumenta el valor a, p. 2048 puedes ver todas las dlls cargadas.

Aquí está la clave relevante:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager

DebuggerMaxModuleMsgs DWORD = por ejemplo, 2048

Cuestiones relacionadas