WinDbg可以看到的模块数量是否有上限?

Nic*_*vre 5 debugging windbg

有谁知道WinDbg可以看到的DLL数量是否有上限?我相信Visual Studio曾被限制在500,但我无法在工作的某些二手账户之外找到这种索赔的来源.

我正在尝试调试一个毛茸茸的场景,而WinDbg的堆栈跟踪是不完整的.根据Process Explorer,我感兴趣的模块已加载但它没有显示在WinDbg的'lm'输出中.

可疑的是,输出正好是500个模块长,即使我知道还有很多比加载,导致我相信WinDbg没有看到超过前500的DLL.任何人都可以确认?或者提出一些其他原因,为什么加载的模块可能不会出现在'lm'中?


编辑:经过进一步的调查,我能够在加载该模块之前,通过更早地附加调试器来加载WinDbg以查看我需要的模块.

在我看来,在附加到进程后,调试器引擎只会看到前500个dll,但会正确处理后续加载.我仍然喜欢WinDbg专家的确认,或者更好的是,在附加时绕过处理超过500个模块!

Alo*_*aus 5

有一个注册表项控制调试器可以看到的调试器消息的数量。当您将该值增加到例如 2048 时,您可以看到所有加载的 dll。

这是相关的关键:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

DWORD DebuggerMaxModuleMsgs = 例如 2048


Kje*_*nar 3

我已经过期,由于模块列表损坏,windbg 没有显示所有模块。这是我在 32 位 xp userdumps 上使用的一个脚本(可以在 Windbg 帮助文件中找到)。当寻找 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}
    }
Run Code Online (Sandbox Code Playgroud)