2015-10-29 4 views
5

मेरा ऐप ग्राहक द्वारा भेजे गए डेटा deserialize की कोशिश करता है और यह निम्नलिखित त्रुटि के साथ विफल:डिबग कैसे करें (चरण में) BinaryFormatter.Deserialize()?

Exception thrown: 'System.Runtime.Serialization.SerializationException' in mscorlib.dll

Additional information: Cannot get the member '<.ctor>b__0'.

Googling कोई परिणाम देता है। ठीक है, मैंने फैसला किया कि मैं deserialization तर्क में कदम होगा और यह पता लगाने की कोशिश करें कि वास्तव में इसका क्या कारण है। खैर, एक दिन बीत चुका है और मैं कहीं भी करीब नहीं हूं।

मैंने विजुअल स्टूडियो को कॉन्फ़िगर करने के लिए Microsoft Reference Source वेबसाइट से निर्देशों का उपयोग किया। । स्थापित dotTrace एप्लिकेशन और used it as source server - यह डाउनलोड कुछ

MicrosoftPublicSymbols\mscorlib.pdb\ 
    DCF1E4D31F6944AC87E7A634262BEE881\mscorlib.pdb (780kb) 
    E47257B512BA49BC9FC367C532FC5F1E2\mscorlib.pdb (953kb) 

लेकिन डीबगर में कदम नहीं करता है

मैं और अधिक googled और एक और तरीका यह करने के लिए मिल गया है। और यह या तो मदद नहीं करता है। मैं अभी भी निम्न देखें:

enter image description here

Symbol Load Information mscorlib.pdb के लिए पॉपअप कहते

C:\Users\me\AppData\Local\Temp\SymbolCache\MicrosoftPublicSymbols\mscorlib.pdb\e47257b512ba49bc9fc367c532fc5f1e2\mscorlib.pdb: Symbols loaded.

मैं System.Windows.Forms, System.Linq, आदि में कदम कर सकते हैं - बोल तो आम तौर पर, यह काम करता है - यह सिर्फ BinaryFormatter.Deserialize() पर यह विशेष कॉल काम नहीं करता है। इसके कारण क्या हो सकते हैं और मैं इसे कैसे कदम उठा सकता हूं?

क्या यह SecuritySafeCritical विशेषता के कारण हो सकता है?

[System.Security.SecuritySafeCritical] 
public Object Deserialize(Stream serializationStream) 

मैं वीएस 2015 का उपयोग कर रहा हूं .Net 4.5.2 (हालांकि मैंने उसी परिणाम के साथ 4.5 की कोशिश की)।

+1

क्या आप माइक्रोसॉफ्ट कोड डीबग करना चाहते हैं या deserialization समस्या को हल करना चाहते हैं? –

+0

मुझे नहीं पता कि एमएस कोड डीबग किए बिना मेरी deserialization समस्या को हल करने के लिए कैसे, तो मैं देख सकता हूं कि यह वास्तव में क्यों विफल रहता है।क्या आपके पास बेहतर सुझाव हैं? – avs099

+0

आपको सीरियलज़ेड डेटा कैसे मिला? क्या आप सबसे सरल उदाहरण बना सकते हैं जो व्यवहार को पुन: उत्पन्न करता है? –

उत्तर

8

किसी भी विवरण के बिना मैं मान सकता हूं कि यह & deserialize serialize करने की कोशिश कर रहे ऑब्जेक्ट्स के संस्करणों के साथ संगतता मुद्दा है। ऐसा लगता है कि क्लाइंट आपको कुछ पुरानी ऑब्जेक्ट बिट्स (कन्स्ट्रक्टर में लैम्ब्डा के बिना) भेजता है। और आपका सर्वर कुछ लैम्ब्डा विधि के लिए खोज रहे सॉफ़्टवेयर के नए संस्करण को चला रहा है।

< .ctor> b__0 - .ctor (ऑब्जेक्ट कन्स्ट्रक्टर) में पहली लैम्ब्डा विधि के लिए विधि का नाम है।

इसलिए उदाहरण के लिए आप ग्राहक की मशीन वस्तु एक पर था:

class A { 
    public A() { 
    int a = 5; 
    int b = 7; 
    // Plain code, no lambdas 
    } 
} 

तो फिर तुम निर्माता में सर्वर शुरू लैम्ब्डा पर अपनी कक्षा अद्यतन:

class A { 
    public A() { 
    int a = 5; 
    int b = 7; 
    Func<int,int> some = x => x * 2 + a; 
    } 
} 

उसके बाद उनके द्विआधारी प्रतिनिधित्व नहीं है वही, ए के सर्वर संस्करण में निजी अदृश्य विधि < है। इसमें> b__0।

Generated IL for lamda method in class A1

+0

अच्छी तरह से अच्छा काम किया लेकिन दुर्भाग्य से यह मामला नहीं है। स्रोत फाइलें वर्षों में नहीं बदली हैं, और उनमें कोई भेड़िया नहीं है। – avs099

+0

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

+0

@ एग्लासियस नोप, आशाजनक लग रहा था लेकिन मेरा मामला नहीं था :(यदि आप इसके निचले हिस्से तक पहुंच सकते हैं, तो कृपया साझा करें :) – avs099

2

माइक्रोसॉफ्ट हर mscorlib.dll अद्यतन के स्रोत को अपलोड नहीं करता है, इस कारण है कि आप केवल किसी भी स्रोत डेटा के बिना सार्वजनिक PDBs मिलता है। लेकिन Redgate's Reflector से एक विजुअल स्टूडियो एडन है जहां आप decompile 3rd party DLLs and step through them in the VS debugger कर सकते हैं।

enter image description here

enter image description here

JetBrains से DotPeek भी supports PDB generation and hosting of a Symbol server डिबगिंग अनुमति देने के लिए।

शायद यह आपको अपनी समस्या को डीबग करने में मदद करता है।

+0

स्पष्ट नहीं है - क्या आप कह रहे हैं कि बाइनरी फॉर्मेटर स्रोतों के साथ एक सार्वजनिक पीडीबी है लेकिन यह .NET के पुराने संस्करण के लिए है? तब मैं इसे कहां प्राप्त कर सकता हूं? पुन: डॉटपीक - जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, मैंने कोशिश की लेकिन इससे मदद नहीं मिली। – avs099

+0

सार्वजनिक पीडीबी के पास कोई लिंक स्रोत स्रोत नहीं है। 4.5.2 आरटीएम पर वापस जाने के लिए किसी भी .net अपडेट को अनइंस्टॉल करें। अब आप संदर्भ सर्वर से निजी पीडीबी + स्रोत प्राप्त कर सकते हैं: http://referencesource.microsoft.com/ – magicandre1981

1

टीएल; डॉ: एक कंपाइलर (या अलग सेटिंग्स?) के विभिन्न संस्करण किसी अज्ञात फ़ंक्शन से संबंधित जेनरेट विधि के लिए अलग-अलग नाम उत्पन्न कर सकते हैं। यदि इस तरह की एक विधि को धारावाहिक वर्ग के निजी क्षेत्र द्वारा इंगित किया जाता है तो आपको अपवाद मिलता है, भले ही स्रोत 2 बिल्डों के बीच परिवर्तित न हो।


मैंने अभी सटीक प्रकार की स्थिति को ट्रैक किया है, लेकिन despialization एएसपीनेट एप्लिकेशन के सत्र में ट्रिगर किया गया है। इस मामले की तरह, बाइनरीफॉर्मेटर का उपयोग किया जाता है।

< .ctor> b__0 किसी अज्ञात फ़ंक्शन से संबंधित जेनरेट विधि से मेल खाता है।

अब, समस्या यहां क्रमबद्धता के दौरान ऐसी विधि पर निर्भरता है, क्योंकि नाम अलग-अलग निर्माण (यहां तक ​​कि एक अपरिवर्तित स्रोत के साथ) पर समान होने की गारंटी नहीं है। यह लगभग निश्चित रूप से एक धारावाहिक वर्ग के एक निजी उदाहरण क्षेत्र में किसी तरह के प्रतिनिधि को ट्रैक करता है। ध्यान दें कि ऐसी कक्षा जहां अज्ञात फ़ंक्शन घोषित किया गया है वह आवश्यक वर्ग नहीं है जो उस कार्य के संदर्भ को किसी निजी क्षेत्र में संदर्भित करता हो।

दुर्भाग्य से मेरे पास यह ट्रैक करने का समय नहीं था कि एक ही स्रोत अज्ञात फ़ंक्शन के लिए अलग-अलग नाम क्यों उत्पन्न करता है, लेकिन परियोजना के इतिहास को देखते हुए यह या तो पास किए गए विकल्पों का एक अलग संकलक संस्करण है। मुझे विश्वास है कि यह पहले है।

यदि आपके पास दोनों तरफ असेंबली तक पहुंच है, तो आप परिवर्तन की पुष्टि कर सकते हैं। सबसे पहले मैंने डॉटपीक में दोनों असेंबली के असम्बद्ध स्रोत को निर्यात करने और फिर फ़ोल्डरों का एक अंतर करने का प्रयास किया। यह एक अच्छी प्रक्रिया साबित नहीं हुआ है, लेकिन यह कुछ डॉटपीक सेटिंग्स के कारण हो सकता है जिन्हें सेट या कुछ सेट करने की आवश्यकता है।

परस्पर और परावर्तक के संयोजन का उपयोग करके बेहतर काम किया गया था। आप पहले की असेंबली तुलना कर सकते हैं। जिस तरह से मैंने किया था, धारावाहिक वर्गों के सभी रचनाकारों को प्राप्त करने के लिए प्रश्नों में से किसी एक को बदलने के लिए किसी भी प्रकार का परिवर्तन था। इससे इसे कुछ वर्गों/रचनाकारों तक सीमित कर दिया गया है (यदि गैर-धारावाहिक वर्ग में अज्ञात फ़ंक्शन बनाया गया था, तो इसे इस तरह पकड़ने का जोखिम नहीं है)।

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

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

यह भी ध्यान दें कि जहां कोड बदल दिया गया है, वही कंपाइलर संस्करण/विकल्प आपको अलग-अलग नाम दे सकता है, इसलिए यह काम करने के लिए क्रमबद्ध वर्गों में निजी फ़ील्ड रखने के लिए बहुत भंगुर है। निम्नलिखित उत्तर इस पर फैला है: https://stackoverflow.com/a/1133465/66372

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