【问题标题】:Is there a cap on the number of modules WinDbg can see?WinDbg 可以看到的模块数量是否有上限?
【发布时间】:2012-01-01 11:15:12
【问题描述】:

有谁知道 WinDbg 可以看到的 DLL 数量是否有上限?我相信 Visual Studio 曾经的上限为 500,但除了工作中的一些二手帐户之外,我找不到此声明的来源。

我正在尝试调试一个复杂的场景,但 WinDbg 的堆栈跟踪不完整。根据 Process Explorer,我感兴趣的模块已加载,但未显示在 WinDbg 中的“lm”输出中。

可疑的是,所说的输出正好是 500 个模块长,尽管我知道加载的模块不止于此,这让我相信 WinDbg 没有看到超过前 500 个的 DLL。任何人都可以确认吗?或者提出其他一些为什么加载的模块可能不会出现在“lm”中的原因?


编辑:经过进一步调查,我能够让 WinDbg 加载查看我需要的模块,方法是在加载该模块之前提前附加调试器。 p>

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

【问题讨论】:

  • 我也有这个。通常似乎是 MS 调试 API 的限制。 Visual Studio 也有同样的限制。

标签: debugging windbg


【解决方案1】:

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

这里是相关键:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

DWORD DebuggerMaxModuleMsgs = 例如2048

【讨论】:

    【解决方案2】:

    我已经过期了,由于模块列表中的损坏,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}
        }
    

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      相关资源
      最近更新 更多