2011-11-18 7 views
5

क्या किसी को पता है कि डीएलएल की संख्या पर कैप है या नहीं, WinDbg देख सकता है? मेरा मानना ​​है कि विजुअल स्टूडियो को एक बार 500 पर कैप्ड किया गया था लेकिन मुझे काम पर कुछ दूसरे हाथ खातों के बाहर इस दावे का स्रोत नहीं मिला।क्या WinDbg देख सकते हैं मॉड्यूल की संख्या पर एक टोपी है?

मैं एक बालों वाले परिदृश्य को डीबग करने की कोशिश कर रहा हूं और WinDbg का स्टैक ट्रेस अपूर्ण है। प्रक्रिया एक्सप्लोरर के अनुसार, जिस मॉड्यूल में मुझे रूचि है, वह लोड हो गया है लेकिन यह WinDbg में 'एलएम' के आउटपुट में दिखाई नहीं देता है।

संदिग्ध रूप से, कहा गया है कि आउटपुट बिल्कुल 500 मॉड्यूल लंबा है, भले ही मुझे पता है कि लोड होने से बहुत अधिक हैं, मुझे विश्वास है कि WinDbg पहले 500 से अधिक डीएलएल नहीं देख रहा है। क्या कोई पुष्टि कर सकता है? या किसी अन्य कारण का सुझाव दें कि एक लोड मॉड्यूल 'एलएम' में क्यों नहीं दिख सकता है?


संपादित: आगे की जांच पड़ताल करने पर, मैं मॉड्यूल मैं डिबगर पहले, इससे पहले कि कि मॉड्यूल लोड किया गया था संलग्न द्वारा की जरूरत को देखने के लोड करने के लिए WinDbg प्राप्त करने में सक्षम था।

ऐसा लगता है कि, एक प्रक्रिया को जोड़ने पर, डीबगर इंजन केवल पहले 500 डीएलएस देखेगा लेकिन बाद में लोड को सही तरीके से संसाधित करेगा। मैं अभी भी WinDbg विशेषज्ञ से पुष्टि करना पसंद करूंगा, या फिर बेहतर है, संलग्न होने पर 500 से अधिक मॉड्यूल को संसाधित करने के लिए बाईपास!

+0

मेरे पास यह भी था। सामान्य रूप से एमएस डीबगिंग एपीआई की सीमा माना जाता है। विजुअल स्टूडियो एक ही सीमा दिखाता है। –

उत्तर

3

मुझे समाप्त हो गया है कि मॉड्यूल सूची में भ्रष्टाचार के कारण विंडबग ने सभी मॉड्यूल प्रदर्शित नहीं किए हैं। यहां एक स्क्रिप्ट है (विंडबग सहायता फ़ाइल में मिली) जिसे मैंने 32 बिट्स xp userdumps पर उपयोग किया है। जब मॉड्यूल के लिए शिकार एलएम आउटपुट में नहीं मिला है। आप विंडबग में! डीएलएस को भी आजमा सकते हैं।

$$ 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 आप सभी भारित डीएलएस देख सकते हैं। \ नियंत्रण \ सत्र प्रबंधक

DWORD DebuggerMaxModuleMsgs = उदा \ CurrentControlSet

HKEY_LOCAL_MACHINE \ SYSTEM:

यहाँ प्रासंगिक कुंजी है 2048