Visual Studio डीबगर से ऑब्जेक्ट को क्रमबद्ध कैसे करें


88

मैं एक क्रैश डंप में बग की जांच करने की कोशिश कर रहा हूं (इसलिए मैं कोड नहीं बदल सकता)। मेरे पास वास्तव में जटिल वस्तु है (क्रमबद्ध प्रतिनिधित्व में हजारों लाइनें) और इसकी स्थिति असंगत है। इसकी स्थिति की जाँच करने के लिए Visual Studio डीबगर दृश्य बेकार है। लेकिन ऑब्जेक्ट का डेटा अनुबंध है। मैं इसे क्रमबद्ध करना चाहूंगा और फिर ऑब्जेक्ट में नेविगेट करने के लिए अपने पसंदीदा टेक्स्ट एडिटर का उपयोग करूंगा। क्या डिबगर से ऐसा करना संभव है?


ध्यान दें, यदि आपके पास कुछ कस्टम कंटेनर क्लास है, या कोई अन्य वर्ग है जिसे आप डिबग के दौरान कई बार देखना चाहते हैं, लेकिन IntelliSense और QuickView इसका पता नहीं लगा सकते हैं, तो आप वीएस के लिए एक एक्सटेंशन लिख सकते हैं जो आपके कस्टम वर्ग को दिखाने में मदद करता है। डिबग।
सेसाबा टोथ

कई अच्छी तकनीकें भी यहां देखी जा सकती हैं [ stackoverflow.com/questions/360277/… )
जोश

जवाबों:


86

कुछ समय पहले मैंने इस एक-लाइनर को डिस्क पर फ़ाइल की ऑब्जेक्ट को क्रमबद्ध करते हुए लिखा था। इसे अपनी तत्काल विंडो में कॉपी / पेस्ट करें, और objअपनी वस्तु के साथ बदलें (यह दो बार संदर्भित है)। यह एक text.xmlफ़ाइल c:\tempको आपकी पसंद के अनुसार बदल देगा।

(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)

किसी भी जादू की उम्मीद न करें, यदि वस्तु को क्रमबद्ध नहीं किया जा सकता है, तो यह एक अपवाद फेंक देगा।


3
इसने मेरे लिए तत्काल विंडो में काम किया। upvoted,
पंकज कुमार

1
जब मैं वीएस 2015 तत्काल विंडो पर इसका उपयोग करता हूं, तो मुझे यह 'त्रुटि' मिलती है: "इस संदर्भ में मूल तरीकों का मूल्यांकन समर्थित नहीं है।" विचार?
वेट्रस

जब मैं इसे चलाता हूं, तो मुझे निम्न संदेश मिलता है:identifier "System" is undefined
रसूल

एक पुरानी VB.NET परियोजना थी, इसे इस तरह से रखना था अन्यथा मुझे अभिव्यक्ति सिंटैक्स के बारे में एक त्रुटि मिल रही थी, अगर किसी को ज़रूरत हो: नई System.Xml.Serialization.XmlSerializer (obj.GetType) ()। Serialize (New System.IO) .StreamWriter ("C: \ temp \ temp.txt"), obj)
लिक्विड कोर

यह शानदार है। मुझे लिखने की अनुमति के कारण एक अलग निर्देशिका का उपयोग करना था, लेकिन यह एक आकर्षण की तरह काम करता था। एक्सेल में आयात करें और यह बहुत सुंदर है।
बडीजेड

160

किसी भी भाग्य के साथ आपके पास पहले से ही Json.Net है। किस स्थिति में इसे अपनी तत्काल विंडो में पॉप करें:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)


19
काश मैं इसे फिर से उभार सकता, विशेष रूप से अन्य उत्तरों की तुलना में। (क्षमा करें, लेकिन मुझे अपने करियर में एक्सएमएल की एक और लाइन देखने की आवश्यकता नहीं है।)
यज़ॉर्ग २१'१४

1
बहुत लंबे परीक्षण डिबग सत्र के बाद मेरे कार्यक्रम में एक अपवाद हुआ, इससे पहले कि वह एक फ़ाइल के हजारों परीक्षण परिणाम लिख सके, मैं एक ब्रेकपॉइंट पर था जहां अपवाद हुआ और अभी भी परिणाम संग्रह का निरीक्षण कर सकता था। इस टिप ने मुझे बहुत समय बचाया!
HAL9000

1
आपको वास्तव में कहीं और Json.Net का उपयोग करने की आवश्यकता हो सकती है ताकि इसे तब लोड किया जाए जब आप इसे तत्काल विंडो में उपयोग करने की कोशिश करते हैं (जैसा कि सिर्फ संदर्भ जोड़ने के लिए विरोध किया गया है)।
इवान

1
मुझे Nuget का उपयोग करके Newtonsoft.Json पैकेज को जोड़ना पड़ा, और उस विधि में कोड की एक पंक्ति भी जोड़नी पड़ी, जिसमें मुझे एक डमी Newtonsoft बनाने के लिए ब्रेकप्वाइंट था। सबसे उत्कृष्ट समाधान!
रिचर्ड मूर

1
यह एक बेहतरीन जवाब है। मैं इसे सिर्फ एक छोटे से बदलाव के साथ उपयोग करता हूं ताकि मुझे ब्यूटीफायर की यात्रा को बचाया जा सके। Newtonsoft.Json.Json.Convert.SerializeObject (someVariable, Newtonsoft.Json.Formatting.Indented)
जेमी

37

यहाँ एक विजुअल स्टूडियो एक्सटेंशन है जो आपको वास्तव में ऐसा करने देगा:

https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f

आप JSON, XML या C # में आउटपुट कर सकते हैं


4
यह लिंक टूटा हुआ प्रतीत हो रहा है, लेकिन यहां गितुब परियोजना है और आप इसे "एक्सटेंशन एक्सपोर्टर" के लिए "एक्सटेंशन्स एंड अपडेट्स ..." डायलॉग में विजुअल स्टूडियो में खोज सकते हैं। महान विस्तार btw!
निकल्स सॉडरबर्ग

2
धन्यवाद @ उमर विचार एकदम सही है। लेकिन इसमें बहुत समय लगता है और कुछ मामलों में फ्रीज होता है
वाहिद बितर

1
@WahidBitar के साथ सहमत - महान अवधारणा - यूनिट टेस्ट डेटा सेट करने के लिए एकदम सही है, लेकिन विस्तार काफी छोटी लग रहा है, और क्रैश होने पर विजुअल स्टूडियो को अपने साथ ले जाता है!
दिब

यह वास्तव में एक बहुत ही उपयोगी उपकरण है।
आशुतोष सिंह


4

विजुअल स्टूडियो की "तत्काल" विंडो में इसका उपयोग करें, c:\directory\file.jsonजिस फाइल को आप JSON लिखना चाहते हैं और जिसे myObjectआपके चर के साथ क्रमबद्ध करना है:

System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))

3

मेरे पास एक एक्सटेंशन विधि है जिसका मैं उपयोग करता हूं:

public static void ToSerializedObjectForDebugging(this object o, FileInfo saveTo)
{
    Type t = o.GetType();
    XmlSerializer s = new XmlSerializer(t);
    using (FileStream fs = saveTo.Create())
    {
        s.Serialize(fs, o);
    }
}

मैं इसे SaveTo के लिए एक स्ट्रिंग के साथ अधिभारित करता हूं और इसे तत्काल विंडो से कॉल करता हूं:

public static void ToSerializedObjectForDebugging(this object o, string saveTo)
{
    ToSerializedObjectForDebugging(o, new FileInfo(saveTo));
}

3

इसे क्रमबद्ध करने के लिए तत्काल विंडो का उपयोग करना और फिर सामग्री को अपने पसंदीदा संपादक में कॉपी करना संभव हो सकता है।

एक अन्य विकल्प ओवरराइड करना है ToString() विधि और डिबग मोड में रहते हुए कॉल करना है।

आप क्रैश से कुछ समय पहले एक फ़ाइल में सामग्री भी लिख सकते हैं, या कोड को एक कोशिश / कैच में लपेट सकते हैं और फिर फ़ाइल लिख सकते हैं। मैं मान रहा हूँ कि आप दुर्घटनाग्रस्त होने पर पहचान सकते हैं।


धन्यवाद, मैंने वॉच विंडो से समान कोशिश की, लेकिन इसने मुझे बताया "फ़ंक्शन मूल्यांकन को चलाने के लिए सभी थ्रेड्स की आवश्यकता होती है।" तत्काल खिड़की इसे हल करें
xvorsx

1

उमर इलाबद के उत्तर पर एक भिन्नता -

यह मुफ़्त नहीं है, लेकिन OzCode
( https://marketplace.visualstudio.com/items?itemName=CodeValue.in.OzCode) के लिए एक नि: शुल्क परीक्षण है। ) के ।

वहाँ JSON को संदर्भ / हॉवर मेनू के भीतर अंतर्निहित निर्यात किया गया है, और यह ऑब्जेक्ट एक्सपोर्ट एक्सटेंशन (इससे मुक्त न होने के लिए व्यापार बंद) की तुलना में थोड़ा बेहतर काम करता है।

http://o.oz-code.com/features#export (डेमो)

मुझे पता है कि यह इस तथ्य के कुछ साल बाद है, लेकिन मैं यहां एक जवाब छोड़ रहा हूं क्योंकि यह मेरे लिए काम करता है, और कोई और इसे उपयोगी पा सकता है।


1

यदि आपके पास एक परिपत्र संदर्भ है, तो इसे तत्काल विंडो में चलाएं:

Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented,
new Newtonsoft.Json.JsonSerializerSettings
{
    ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize
});

1

मैं ObjectDumper.Net का उपयोग कर रहा हूं

यह अच्छी तरह से काम करता है, खासकर यदि आपके पास लाइव यूनिट परीक्षण है। मैं कंसोल में एक चर का मान आसानी से देख सकता हूं जब एक परीक्षण चलता है, मुझे मैन्युअल रूप से डिबगिंग से बचा रहा है।

यदि आप XUnit का उपयोग कर रहे हैं तो यह मदद कर सकता है।


0

एलेक्सी के जवाब पर एक बदलाव। थोड़ा और अधिक जटिल लेकिन पाठ फ़ाइल में लिखना शामिल नहीं है:

1) तत्काल खिड़की में प्रवेश:

System.IO.StringWriter stringWriter = new System.IO.StringWriter();  

2) वॉच विंडो में दो घड़ी डालें:

a.  stringWriter

b.  new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj) 

आपके द्वारा दूसरी घड़ी (सीरियल एक) दर्ज करने के बाद स्ट्रिंग स्ट्रिंग मान को XML पर अनुक्रमित करने के लिए सेट किया जाएगा। इसे कॉपी और पेस्ट करें। ध्यान दें कि XML घुंघराले ब्रेसिज़, {...} में संलग्न होगा, इसलिए यदि आप किसी भी चीज़ के लिए XML का उपयोग करना चाहते हैं, तो आपको उन्हें निकालना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.