2012-02-16 10 views
5

मैं हाल ही में डेव डेटलेफ़ द्वारा this article पढ़ रहा था जिसमें वह कुछ मामलों को प्रस्तुत करता है जहां सीएलआर सरणी सीमाओं को समाप्त करने की जांच करता है। मैं इस अपने आप को परीक्षण करने का फैसला, तो मैं निम्नलिखित किया:एआरई बाउंड सीएलआर में उन्मूलन की जांच करें?

  • खोला विजुअल स्टूडियो 2010 अंतिम SP1
  • बनाया प्रकार का एक नया सी # परियोजना कंसोल अनुप्रयोग (लक्षित कर डिफ़ॉल्ट रूप से .NET 4 ग्राहकों का प्रोफाइल)
  • जोड़ा निम्नलिखित कोड (सभी उप-तरीकों लेख से सीधे लिया जाता है):

    class Program { 
        static void Main(string[] args) { 
         int[] array = new int[30]; 
         Test_SimpleAscend(array); 
         Test_SimpleRedundant(array, 3); 
    
         foreach (int i in array) { 
          Console.WriteLine(i); 
         } 
        } 
    
        static void Test_SimpleAscend(int[] a) { 
         for (int i = 0; i < a.Length; i++) 
          a[i] = i; 
        } 
    
        static void Test_SimpleRedundant(int[] a, int i) { 
         int k = a[i]; 
         k = k + a[i]; 
        } 
    } 
    
  • मोड रिलीज पर स्विच किया गया; सत्यापित किया है कि "अनुकूलन कोड" विकल्प बिल्ड

  • जोड़ा प्रत्येक सरणी का उपयोग करने के लिए एक ब्रेकपाइंट, डिबगिंग (F5) शुरू कर दिया में चेक किया गया है और Dissassembly विंडो खोली

तो यहाँ के लिए dissassembly है एक [i] = मैं; Test_SimpleAscend में:

   a[i] = i; 
00000024 mov   eax,dword ptr [ebp-4] 
00000027 mov   edx,dword ptr [ebp-8] 
0000002a cmp   eax,dword ptr [edx+4] 
0000002d jb   00000034 
0000002f call  64FD6E08 
00000034 mov   ecx,dword ptr [ebp-4] 
00000037 mov   dword ptr [edx+eax*4+8],ecx 

सीएमपी/जेबी/कॉल सीमा चेकिंग, वास्तव में कॉल के लिए मजबूर कर निष्पादित करने के लिए एक IndexOutOfRangeException फेंकता है।

टेस्ट_SimpleRedundant में अनावश्यक पहुंच सहित सभी सरणी एक्सेसों के लिए वही बात। तो क्या मेरी परीक्षण पद्धति में कुछ गड़बड़ है, या सीएलआर वास्तव में सीमाओं की जांच को खत्म नहीं करता है? मुझे उम्मीद है कि मैं गलत हूं और यदि ऐसा है तो मैं जानना चाहता हूं कि मैं वास्तव में उन्मूलन की जांच कैसे कर सकता हूं।

डिफ़ॉल्ट रूप से, JIT अनुकूलन जब डिबगिंग अक्षम हैं:

+10

जब आप "डीबगिंग शुरू करना" कहते हैं, तो मुझे लगता है कि आपने विजुअल स्टूडियो पर्यावरण से * डीबगर संलग्न * के साथ एप्लिकेशन * लॉन्च किया है। उस स्थिति में, आपको यह सुनिश्चित करना होगा कि जेआईटी संकलन सक्षम है क्योंकि यह डिफ़ॉल्ट रूप से नहीं है। जेआईटी कंपाइलर वह है जो इस अनुकूलन को करता है, सी # कंपाइलर नहीं। –

+0

सीमा शुल्क जांच अक्षम होने पर आप क्या होने की उम्मीद करते हैं? यह आमतौर पर एक विशेषता है जो लोगों को सी # जैसी प्रबंधित भाषा का उपयोग करते समय होने की उम्मीद है। –

+1

अनुकूलन सुनिश्चित करने का सबसे आसान तरीका वास्तव में डिबगिंग के बिना एप्लिकेशन को प्रारंभ करने के लिए सक्षम है और फिर इसे डीबगर संलग्न करें। – svick

उत्तर

12

कोड़ी ग्रे द्वारा एक टिप्पणी के लिए धन्यवाद, मैं अपने खुद के सवाल का जवाब देने प्रबंधित किया है। इसे ठीक करने के लिए, कोई डीबग -> विकल्प और सेटिंग्स -> डिबगिंग -> सामान्य पर जा सकता है, और "बस मेरा कोड सक्षम करें" और "मॉड्यूल लोड पर जेआईटी अनुकूलन को दबाएं" दोनों को अनचेक करें।

भी देखें http://msdn.microsoft.com/en-us/library/ms241594.aspx

अनुकूलन सक्षम होने पर, के रूप में विज्ञापित सीमा निकाल दिए जाते हैं चेक करें।

मैं इसे यहां दस्तावेज़ीकरण उद्देश्यों के लिए छोड़ दूंगा।

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