2011-11-18 3 views
5

WinDbg가 볼 수있는 DLL 개수에 제한이 있는지 아는 사람 있습니까? 나는 Visual Studio가 한때 500에 모자를 썼다고 믿는다. 그러나 나는 일하는 초침 계정 밖에서이 주장의 출처를 찾을 수 없다.WinDbg에서 볼 수있는 모듈 개수에 제한이 있습니까?

털이 많은 시나리오를 디버깅하려고하는데 WinDbg의 스택 추적이 불완전합니다. Process Explorer에 따르면 관심있는 모듈이로드되었지만 WinDbg의 'lm'출력에는 나타나지 않습니다.

위의 결과는로드 된 것보다 훨씬 많아서 WinDbg이 처음 500 개가 넘는 DLL을보고 있지 않다는 것을 알게되었지만 의심 할 여지없이 500 모듈 길이입니다. 아무도 확인할 수 있습니까? 아니면로드 된 모듈이 '작품'에 나오지 않는 다른 이유를 제안 하시겠습니까?


편집 : 추가 조사에 따라, 내가 디버거 이전, 해당 모듈이로드되기 전에 연결에 필요한 모듈을 볼로드 WinDbg를 얻을 수 있었다.

프로세스에 연결하면 디버거 엔진은 첫 번째 500 dll을 볼 수 있지만 후속로드는 올바르게 처리합니다. 나는 여전히 WinDbg 전문가로부터의 확인을 좋아할 것이고, 더 좋지만, 첨부 할 때 500 개 이상의 모듈을 처리하는 우회도 가능할 것입니다!

+0

나는 이것도 가지고 있었다. 일반적으로 MS 디버깅 API의 한계로 보입니다. Visual Studio에도 동일한 제한 사항이 있습니다. –

답변

3

모듈 목록이 손상되어 만료되었습니다. windbg가 모든 모듈을 표시하지 않았습니다. 32 비트 XP 사용자 덤프에서 사용한 스크립트 (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} 
    } 
3

디버거가 볼 수있는 디버거 메시지의 수를 제어하는 ​​registry key 있습니다. 값을 예 : 2048로드 된 dll을 모두 볼 수 있습니다. 제어 \ 세션 관리자

DWORD의 DebuggerMaxModuleMsgs = 예 \ CURRENTCONTROLSET \

의 HKEY_LOCAL_MACHINE \ 시스템 : 여기서

은 해당 열쇠 2048

관련 문제