Есть ли ограничение на количество модулей, которые WinDbg может видеть? - PullRequest
5 голосов
/ 18 ноября 2011

Кто-нибудь знает, есть ли ограничение на количество библиотек, которые WinDbg может видеть? Я считаю, что Visual Studio был когда-то ограничен 500, но я не могу найти источник для этого требования за пределами каких-либо подержанных учетных записей в работе.

Я пытаюсь отладить сложный сценарий, и трассировка стека WinDbg не завершена. Согласно Process Explorer, модуль, который меня интересует, загружен, но не отображается в выводе lm в WinDbg.

Подозрительно, указанный вывод имеет длину ровно 500 модулей, хотя я знаю, что их намного больше, чем загруженных, что наводит меня на мысль, что WinDbg не видит библиотеки DLL после первых 500. Кто-нибудь может подтвердить? Или предложить другую причину, по которой загруженный модуль может не отображаться в 'lm'?


Редактировать : после дальнейшего изучения я смог заставить WinDbg загрузить нужный модуль, подключив отладчик раньше, до того, как этот модуль был загружен.

Мне кажется, что после присоединения к процессу механизм отладчика будет видеть только первые 500 dll, но будет правильно обрабатывать последующие загрузки. Я все еще хотел бы получить подтверждение от эксперта WinDbg, или, что еще лучше, обходной путь для обработки более 500 модулей при подключении!

Ответы [ 2 ]

3 голосов
/ 22 июля 2013

Существует раздел реестра , управляющий количеством сообщений отладчика, которые может видеть отладчик. Когда вы увеличиваете значение, например 2048 вы можете увидеть все загруженные библиотеки.

Вот соответствующий ключ:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager

DWORD DebuggerMaxModuleMsgs = например 2048

3 голосов
/ 21 ноября 2011

Я истек, что из-за повреждения в списке модулей windbg не отображал все модули. Вот скрипт (находится в справочном файле Windbg), который я использовал на 32-битных xp userdumps. при поиске модулей, не найденных в выводе lm. Вы также можете попробовать! Dlls в 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}
    }
...