वीएस डिबगर 'जादू के नाम' के बारे में कहां जानें


110

यदि आपने कभी परावर्तक का उपयोग किया है, तो आपने शायद देखा कि C # संकलक प्रकार, विधियाँ, फ़ील्ड और स्थानीय चर उत्पन्न करता है, जो डीबगर द्वारा 'विशेष' प्रदर्शन के योग्य हैं। उदाहरण के लिए, 'CS $' से आरंभ होने वाले स्थानीय चर उपयोगकर्ता को प्रदर्शित नहीं किए जाते हैं। अन्य प्रकार के अनाम तरीकों को बंद करने के लिए अन्य विशेष नामकरण परंपराएं हैं, स्वचालित गुणों के क्षेत्र, और इसी तरह।

मेरा प्रश्न: इन नामकरण सम्मेलनों के बारे में कहाँ जाना है? क्या किसी को कुछ प्रलेखन के बारे में पता है?

मेरा उद्देश्य PostSharp 2.0 को समान सम्मेलनों का उपयोग करना है।

जवाबों:


209

ये संकलक के अनजाने कार्यान्वयन विवरण हैं, और किसी भी समय परिवर्तन के अधीन हैं। (अद्यतन: GeneratedNames.cs वर्तमान विवरण के लिए C # स्रोतों में देखें; नीचे विवरण कुछ पुराना है।)

हालाँकि, जब से मैं एक अच्छा लड़का हूँ, यहाँ उन विवरणों में से कुछ हैं:

यदि आपके पास अप्रयुक्त स्थानीय चर है जिसे ऑप्टिमाइज़र हटा देता है, तो हम पीडीबी में वैसे भी इसके लिए डिबग जानकारी का उत्सर्जन करते हैं। हमने प्रत्यय __Deleted$को ऐसे चरों पर चिपका दिया ताकि डिबगर को पता चल जाए कि वे स्रोत कोड में हैं लेकिन बाइनरी में प्रतिनिधित्व नहीं किया गया है।

संकलक द्वारा आवंटित अस्थायी चर स्लॉट को पैटर्न CS $ X $ Y के साथ नाम दिया गया है, जहां X "अस्थायी प्रकार" है और Y अब तक आवंटित की गई अस्थायी संख्या है। अस्थायी प्रकार हैं:

0 --> short lived temporaries
1 --> return value temporaries
2 --> temporaries generated for lock statements
3 --> temporaries generated for using statements
4 --> durable temporaries
5 --> the result of get enumerator in a foreach
6 --> the array storage in a foreach
7 --> the array index storage in a foreach.  

8 और 264 के बीच अस्थायी प्रकार बहुआयामी सरणियों के लिए अतिरिक्त सरणी सूचकांक भंडार हैं।

264 से ऊपर के अस्थायी प्रकारों का उपयोग अस्थायी लोगों के लिए किया जाता है, जिसमें एक निश्चित फिक्सिंग स्टेटमेंट शामिल होता है।

विशेष संकलक-जनित नाम इसके लिए तैयार किए गए हैं:

1 --> the iterator state ("state")
2 --> the value of current in an iterator ("current")
3 --> a saved parameter in an iterator
4 --> a hoisted 'this' in an iterator ("this")
5 --> a hoisted local in an iterator
6 --> the hoisted locals from an outer scope
7 --> a hoisted wrapped value ("wrap")
8 --> the closure class instance ("locals")
9 --> the cached delegate instance ("CachedAnonymousMethodDelegate")
a --> the iterator instance ("iterator")
b --> an anonymous method
c --> anonymous method closure class ("DisplayClass")
d --> iterator class
e --> fixed buffer struct ("FixedBuffer")
f --> anonymous type ("AnonymousType")
g --> initializer local ("initLocal")
h --> query expression temporary ("TransparentIdentifier")
i --> anonymous type field ("Field")
j --> anonymous type type parameter ("TPar")
k --> auto prop field ("BackingField")
l --> iterator thread id
m --> iterator finally ("Finally")
n --> fabricated method ("FabricatedMethod")
o --> dynamic container class ("SiteContainer")
p --> dynamic call site ("Site")
q --> dynamic delegate ("SiteDelegate")
r --> com ref call local ("ComRefCallLocal")
s --> lock taken local ("LockTaken")

जादुई नाम उत्पन्न करने के लिए पैटर्न यह है: P<N>C__SIजहां:

  • P कैशेड डेलीगेट्स और डिस्प्ले क्लास इंस्टेंसेस के लिए CS $ है, अन्यथा खाली।
  • N मूल बात से जुड़ा हुआ नाम है, यदि कोई हो
  • सी ऊपर सूचीबद्ध एस के माध्यम से चरित्र 1 है
  • S एक वर्णनात्मक प्रत्यय है ("वर्तमान", "स्थिति", और इसी तरह) ताकि आपको मेटाडेटा पढ़ते समय याद रखने के ऊपर तालिका न हो।
  • मैं एक वैकल्पिक विशिष्ट संख्या हूं

2
धन्यवाद! मैं देखता हूँ कि क्या मैं PostSharp को बंद कर सकता हूँ क्‍योंकि C # कंपाइलर जेनरेट करता है!
गेल फ्रैइटुर

7
@ एसएलएसी: अल्पकालिक अस्थायी के विपरीत। टिकाऊ अस्थायी नाम के बिना अनिवार्य रूप से स्थानीय चर हैं; उनके पास स्टैक पर एक विशिष्ट स्थान है जो स्टैक फ्रेम के जीवनकाल के लिए रहता है। अल्पकालिक अस्थायी बस स्टैक पर धकेल दी जाती हैं जब उनके भंडारण की आवश्यकता होती है और तब बंद हो जाती है जब इसकी आवश्यकता नहीं होती है। टिकाऊ टेम्परेरी डिबग करने के लिए बहुत आसान हैं, लेकिन अस्थायी लोगों के जीवनकाल को बहुत लंबा कर सकते हैं। जब अनुकूलन बंद हो जाते हैं तो हम टिकाऊ अस्थायी पैदा करते हैं।
एरिक लिपर्ट

मेरे पास क्लोजर कक्षाओं के समान एक अवधारणा है, लेकिन खेतों के रूप में फहराए गए मापदंडों के बजाय, मेरे पास उन्हें स्थानीय चर के रूप में है। यह मापदंडों के लिए बहुत अच्छी तरह से काम करता है, लेकिन डिबगर को कैसे बताएं कि 'यह' 'ldarg.0' नहीं है, लेकिन सूचकांक 4 के साथ स्थानीय चर है? क्या कोई जादू का नाम है?
गेल फ्रैइटुर

23
@ एरिक - क्या आप इस प्रतिक्रिया को C # 5.0 (async / प्रतीक्षा) द्वारा उत्पन्न नामों के साथ अपडेट कर सकते हैं? मैंने कुछ नए उपसर्गों को देखा है :)
गेल फ्राइटुर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.