2011-03-18 9 views
11

मैं एसओएस एक्सटेंशन के साथ WinDbg का उपयोग कर उत्पादन सर्वर से आने वाले हैंगडंप को डिबग कर रहा हूं।WinDbg और SoS, मैं एक बड़ी स्ट्रिंग को प्रिंट/डंप कैसे करूं?

स्टैक्स में से एक में एक स्ट्रिंग पैरामीटर है, जिसे मुझे मूल्य जानने की आवश्यकता है। हालांकि, यह एक बड़ी स्ट्रिंग है, और जब मैं DumpObj का उपयोग कर रहा हूं तो WinDbg इसे प्रिंट नहीं करेगा। यह DumpObj से उत्पादन होता है:

0:036> !do 00000001b30d8668 
Name: System.String 
MethodTable: 0000064278436728 
EEClass: 000006427803e520 
Size: 5125300(0x4e34b4) bytes 
(C:\WINDOWS\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll) 
String: <String is invalid or too large to print> 

Fields: 
       MT Field Offset     Type VT  Attr   Value Name 
000006427843d998 4000096  8   System.Int32 1 instance   2562638 m_arrayLength 
000006427843d998 4000097  c   System.Int32 1 instance   2562637 m_stringLength 
0000064278438170 4000098  10   System.Char 1 instance    3c m_firstChar 
0000064278436728 4000099  20  System.String 0 shared   static Empty 
           >> Domain:Value 0000000000163260:000000007fff0370 00000000001a6760:000000007fff0370 << 
0000064278438020 400009a  28  System.Char[] 0 shared   static WhitespaceChars 
           >> Domain:Value 0000000000163260:000000007fff0b60 00000000001a6760:000000007fff89f0 << 

मैं इस स्ट्रिंग उदाहरण के मान कैसे मिल सकता है? पसंदीदा रूप से एक फ़ाइल में डंप किया गया।

उत्तर

7

मैं 2562638 अक्षरों के पाठ को डंप करने से पहले दो बार सोचूंगा, लेकिन यदि आप वास्तव में चाहते हैं, तो पाठ स्ट्रिंग उदाहरण के फ़ील्ड के बाद संग्रहीत किया जाता है, ताकि आप स्ट्रिंग के वास्तविक पाठ को डंप करने के लिए du <address+offset> <end address> कर सकें। उत्पादन कुछ इस तरह दिखेगा:

00000000`132ab050 "this is an extremely long string" 
00000000`132ab090 " of text, so don't even bother t" 
00000000`132ab0d0 "o try to dump it to the screen -" 

एक फाइल करने के लिए सत्र उत्पादन लॉग इन करके आप आसानी से आउटपुट को कैप्चर और जो कुछ भी पोस्ट-प्रसंस्करण आप की जरूरत कर सकते हैं।

+0

वास्तव में लंबे तारों के मामले में, प्रारंभ पता/अंतिम पता वाक्यविन्यास सीमाओं के कारण काम नहीं करेगा। आपको du

एल का उपयोग करने की आवश्यकता है? <लंबाई बाइट्स>। वास्तव में लंबे तारों के लिए, यह वास्तव में बहुत लंबा लगेगा और WinDbg अब और प्रतिक्रिया नहीं दे रहा है। –

+0

मुझे कमांड विंडो में लॉग में एक ही संदेश मिलता है: <स्ट्रिंग अमान्य है या प्रिंट करने के लिए बहुत बड़ा है> –

+0

मुझे समझ में नहीं आता है। आप किस प्रकार का आदेश टाइप करेंगे? –

13

यहां एक स्क्रिप्ट है जिसे मैंने विंडबग के भीतर एक फ़ाइल में तारों को डंप करने के लिए लिखा था।

$$ Dumps the managed strings to a file 
$$ Platform x86 
$$ Usage $$>a<"c:\temp\dumpstringtofolder.txt" 6544f9ac 5000 c:\temp\stringtest 
$$ First argument is the string method table pointer 
$$ Second argument is the Min size of the string that needs to be used filter 
$$ the strings 
$$ Third is the path of the file 
.foreach ($string {!dumpheap -short -mt ${$arg1} -min ${$arg2}}) 
{ 

    $$ MT  Field  Offset    Type VT  Attr Value Name 
    $$ 65452978 40000ed  4   System.Int32 1 instance 71117 m_stringLength 
    $$ 65451dc8 40000ee  8   System.Char 1 instance  3c m_firstChar 
    $$ 6544f9ac 40000ef  8  System.String 0 shared static Empty 

    $$ start of string is stored in the 8th offset, which can be inferred from above 
    $$ Size of the string which is stored in the 4th offset 
    [email protected]$t0= poi(${$string}+4)*2 
    .writemem ${$arg3}${$string}.txt ${$string}+8 ${$string}[email protected]$t0 
} 

और इस यह कैसे $$>a<”c:\temp\dumpstringtofolder.txt” 6544f9ac 5000 c:\temp\stringtest

फेंक दिया सामग्री इस्तेमाल किया जा सकता यूनिकोड प्रारूप में होगा और उसकी सामग्री को देखने के लिए है इस Console.WriteLine(ASCIIEncoding.Unicode.GetString(File.ReadAllBytes(@"c:\temp\stringtest03575270.txt")));

HTH

+0

मैं स्क्रिप्ट को मेरे लिए काम नहीं कर सका, लेकिन। राइटमेम फ़ंक्शन आपके नमूने के आधार पर काफी सरल है, मैं इसे स्वयं काम करने में सक्षम था। –

+0

@AndrewArnott मैं इस स्क्रिप्ट का उपयोग करके स्ट्रिंग को डंप करने में सक्षम था और मैं इसे अक्सर उपयोग करता हूं। आप जिस मुद्दे पर चल रहे थे वह क्या था? क्या आप इसे x86/x64 में उपयोग कर रहे हैं? – Naveen

+1

यह सुनिश्चित नहीं है कि हम आउटपुट पर भरोसा कर सकते हैं! नाम 2 ईई लेकिन इसका उपयोग विधि तालिका सूचक स्वचालित रूप से (आर @ $ टी 1) प्राप्त करने के लिए किया जा सकता है, इसलिए हम पैरामीटर 1 से छुटकारा पा सकते हैं। .foreach/pS 7/ps 4 (methodtable {! Name2EE mscorlib.dll System.String}) {r @ $ t1 = $ {methodtable}} –

1

की तरह कुछ का उपयोग आप कर रहे हैं जल्दबाजी में, WinDbg में लॉग सक्षम करने के बाद चलाएं! लॉग फ़ाइल में, आपको पूरी स्ट्रिंग मिल जाएगी।

WinDbg मेनू में, लॉग फ़ाइल पथ सेट करने के लिए संपादन-> खोलें/बंद फ़ाइल फ़ाइल पर जाएं।

+0

का उपयोग करके स्वचालित किया जा सकता है, मुझे लॉग फ़ाइल में बस एक ही कटा हुआ स्ट्रिंग मिलती है। बस FYI ... – Jace

+1

मुझे कमांड विंडो में लॉग में एक ही संदेश मिलता है: <स्ट्रिंग अमान्य है या मुद्रित करने के लिए बहुत बड़ी है> –

संबंधित मुद्दे