有人知道WinDbg可以看到的DLL数量是否有上限?我相信Visual Studio曾被限制在500,但我无法在工作的某些二手账户之外找到这种索赔的来源。
我正在尝试调试一个毛茸茸的场景,而且WinDbg的堆栈跟踪不完整。根据Process Explorer,我感兴趣的模块已加载,但它没有显示在WinDbg的'lm'输出中。
可疑地说,输出正好是500个模块长,尽管我知道还有很多加载,导致我相信WinDbg没有看到超过前500的DLL。任何人都可以确认?或者提出一些其他原因,为什么加载的模块可能不会出现在'lm'中?
编辑 :经过进一步调查,我能够在加载该模块之前,通过先附上调试器来加载WinDbg以查看我需要的模块。
在我看来,在附加到进程后,调试器引擎只能看到前500个dll,但会正确处理后续加载。我仍然会喜欢WinDbg专家的确认,或者更好的是,在附加时绕过处理超过500个模块!
答案 0 :(得分:3)
我已经过期,由于模块列表中的损坏,windbg没有显示所有模块。 这是我在32位xp userdumps上使用的脚本(在Windbg帮助文件中找到)。 在寻找lm输出中找不到的模块时。 你也可以在windbg中试试!dlls。
$$ 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}
}
答案 1 :(得分:3)
有一个registry key控制调试器可以看到的调试器消息的数量。 当您将值增加到例如2048你可以看到所有装载的dll。
以下是相关密钥:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager
DWORD DebuggerMaxModuleMsgs =例如2048