2011-11-18 34 views
5

Có ai biết nếu có giới hạn về số lượng tệp DLL mà WinDbg có thể thấy không? Tôi tin rằng Visual Studio đã từng bị giới hạn ở mức 500 nhưng tôi không thể tìm thấy nguồn cho khiếu nại này bên ngoài một số tài khoản cũ trong công việc.Có giới hạn về số lượng mô-đun mà WinDbg có thể thấy không?

Tôi đang cố gỡ lỗi một kịch bản lông và dấu vết ngăn xếp của WinDbg chưa hoàn thành. Theo Process Explorer, mô-đun mà tôi quan tâm được tải nhưng nó không hiển thị trong đầu ra của 'lm' trong WinDbg.

Đáng ngờ, cho biết đầu ra chính xác 500 mô-đun dài, mặc dù tôi biết có nhiều hơn tải, dẫn tôi tin rằng WinDbg không nhìn thấy DLL vượt quá 500 đầu tiên. Có ai xác nhận không? Hoặc đề xuất một số lý do khác khiến một mô-đun được nạp có thể không hiển thị trong 'lm'?


Sửa: khi tiếp tục điều tra, tôi đã có thể để có được WinDbg để tải thấy module tôi cần bằng cách gắn các trình gỡ lỗi trước đó, trước khi mô-đun được nạp.

Dường như với tôi rằng, khi gắn vào một quy trình, trình gỡ lỗi sẽ chỉ thấy 500 dll đầu tiên nhưng sẽ xử lý các tải tiếp theo một cách chính xác. Tôi vẫn muốn xác nhận từ một chuyên gia WinDbg mặc dù, hoặc tốt hơn, một bỏ qua để xử lý hơn 500 mô-đun khi gắn!

+0

Tôi cũng có điều này. Dường như là một hạn chế của các API gỡ lỗi MS nói chung. Visual Studio cho thấy cùng một giới hạn. –

Trả lời

3

Tôi đã hết hạn do tham nhũng trong danh sách mô-đun windbg chưa hiển thị tất cả các mô-đun. Đây là một tập lệnh (được tìm thấy trong tệp trợ giúp Windbg) mà tôi đã sử dụng trên 32 bit xp userdumps. khi tìm kiếm mô-đun không tìm thấy trong đầu ra lm. Bạn cũng có thể thử các dlls trong 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} 
    } 
3

registry key kiểm soát số lượng thông báo trình gỡ lỗi mà trình gỡ lỗi có thể thấy. Khi bạn tăng giá trị, ví dụ: 2048 bạn có thể thấy tất cả các dll đã tải.

Đây là chìa khóa liên quan:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager

DebuggerMaxModuleMsgs DWORD = ví dụ 2048

Các vấn đề liên quan