आप डिबग मोड में संकलित कोड के साथ डीबगर में इस समारोह को खोलते हैं,:
bool foo(string arg)
{
return bar(arg);
}
3 ब्रेक अंक आप सेट कर सकते हैं कर रहे हैं:
- समारोह के उद्घाटन ब्रेस पर।
- "वापसी" लाइन पर।
- फ़ंक्शन की समाप्ति ब्रेस पर।
उद्घाटन ब्रेस पर ब्रेक पॉइंट सेट करना मतलब है "इस समारोह को कॉल करने के दौरान तोड़ें"। यही कारण है कि विधि की शुरुआत में नो-ऑप निर्देश है। जब ब्रेकपॉइंट उद्घाटन ब्रेस पर सेट होता है तो डीबगर वास्तव में इसे नो-ऑप पर सेट करता है।
समापन ब्रेस पर ब्रेक पॉइंट सेट करना मतलब है कि "यह फ़ंक्शन निकलने पर तोड़ें"। ऐसा होने के लिए फ़ंक्शन को इसके आईएल में एक एकल रिटर्न निर्देश होना चाहिए, जहां ब्रेक पॉइंट सेट किया जा सकता है। संकलक सक्षम बनाता है कि विधि के तल पर एक अस्थायी चर का उपयोग कर दिया गया मान स्टोर करने के लिए, और
$retTmp = retVal;
goto exit;
में
return retVal;
परिवर्तित करने के लिए और फिर इंजेक्शन लगाने के लिए निम्न कोड द्वारा:
exit:
return $ret;
इसके अलावा, जब डीबग मोड में, कंपाइलर्स वे पीढ़ी के कोड के बारे में बेवकूफ हैं।वे मूल रूप से की तरह कुछ कार्य करें:
GenerateProlog();
foreach (var statement in statements)
{
Generate(statement);
}
GenerateEpilog();
आपके मामले में, आप देख रहे हैं:
return foo(arg);
में अनुवाद किया जा रहा है:
; //this is a no-op
bool retTemp = false;
retTemp = foo(arg);
goto exit;
exit:
return retTemp;
तो संकलक एक "रपट खिड़की अनुकूलन" कर रहा था यह उस कोड को देखने में सक्षम हो सकता है और महसूस हो सकता है कि कुछ अनावश्यकता थी। हालांकि, कंपाइलर्स आमतौर पर डीबग मोड में ऐसा नहीं करते हैं। कंपाइलर ऑप्टिमाइज़ेशन वैरिएबल को खत्म करने जैसी चीजें कर सकते हैं, और निर्देशों को पुन: व्यवस्थित कर सकते हैं, जो डिबगिंग को मुश्किल बनाते हैं। चूंकि डीबग बिल्डिंग का उद्देश्य डीबगिंग को सक्षम करना है, इसलिए ऑप्टिमाइज़ेशन चालू करना अच्छा नहीं होगा।
रिलीज निर्माण में, कोड ऐसा दिखाई नहीं देगा। यही कारण है कि बहुत सरल लग रही समाप्त होता है
return bar(arg);
: ऐसा इसलिए है क्योंकि संकलक खोलने और बंद करने ब्रेसिज़, जो सिर्फ निम्नलिखित पत्ते पर breakpoints सक्षम करने के लिए विशेष कोड संकलित की परिचय नहीं करता है।
ध्यान देने योग्य एक बात यह है कि मुझे नहीं लगता कि सी # कंपाइलर खुदरा निर्माण में भी बहुत अधिक स्लाइडिंग विंडो अनुकूलन करता है। Thats क्योंकि उनमें से अधिकतर अनुकूलन अंतर्निहित प्रोसेसर आर्किटेक्चर पर निर्भर करते हैं और इसलिए जेआईटी कंपाइलर द्वारा किया जाता है। ऑप्टिमाइज़ेशन करना, सी # कंपाइलर में प्रोसेसर अज्ञेयवादी भी कोड को अनुकूलित करने की जेआईटी की क्षमता को बाधित कर सकते हैं (यह गैर-अनुकूलित कोड पीढ़ी द्वारा उत्पन्न पैटर्न की तलाश में है, और यदि यह अत्यधिक अनुकूल आईएल देखता है तो यह प्राप्त हो सकता है उलझन में)। तो आमतौर पर मैंग किए गए कोड कंपाइलर्स उन्हें नहीं करते हैं। यह कुछ "महंगे चीजें" (जो कि जेआईटी रनटाइम पर नहीं करना चाहता), जैसे मृत कोड पहचान, और लाइव चर विश्लेषण, लेकिन वे खिड़की अनुकूलन स्लाइडिंग द्वारा हल की गई समस्याओं का समाधान नहीं करते हैं।
मुझे उचित लगता है –