2011-11-18 43 views
5

有谁知道WinDbg可以看到的DLL数量是否有限制?我相信Visual Studio曾经被限制在500个,但是在工作中的一些二手账户之外我找不到这个索赔的来源。WinDbg可以看到的模块数量是否有限制?

我想调试一个毛茸茸的场景和WinDbg的堆栈跟踪不完整。根据Process Explorer,我感兴趣的模块已加载,但它不会显示在WinDbg中'lm'的输出中。

令人怀疑地说,输出的长度正好是500个模块,尽管我知道有很多比已加载的更多,导致我相信WinDbg没有看到第一个500以后的DLL。谁能确认?或者提出一些其他的原因,为什么一个加载的模块可能不会在'lm'中显示?


编辑:经进一步调查,我能得到的WinDbg加载看到我需要通过附加调试早些时候,该模块被加载之前的模块。

在我看来,在附加进程时,调试器引擎只会看到前500个DLL,但会正确处理后续加载。尽管如此,我仍然喜欢WinDbg专家的确认,或者更好的情况是,在连接时处理超过500个模块的旁路!

+0

我也是这样。似乎是MS调试API的一般限制。 Visual Studio显示相同的限制。 –

回答

3

我已经过期,由于在模块列表中的腐败windbg没有显示所有模块。 这是一个脚本(可在Windbg帮助文件中找到),我已经在32位xp userdumps上使用过。 寻找在lm输出中找不到的模块。 你也可以试试windbg中的!dll。

$$ 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

有一个registry key控制调试器可以看到的调试器消息的数量。 当您将值增加到例如2048你可以看到所有加载的dll。

下面是相关键:

HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \控制\会话管理

DWORD DebuggerMaxModuleMsgs =例如2048

相关问题