2013-03-11 7 views
14

के कारण असफल होने वाले यूनिट परीक्षणों को डिबग करना, जब भी कोई यूनिट परीक्षण StackOverflowException के कारण विफल हो जाता है तो इकाई परीक्षण प्रक्रिया तुरंत बाहर निकलती है - यह पता लगाने का एकमात्र तरीका क्या हुआ (जिसे मैं जानता हूं) एक क्रैश डंप डीबग करना है इकाई परीक्षण प्रक्रिया का पालन करके प्राप्त की सीढ़ियों यहाँस्टैक ओवरव्लो अपवाद

उस समय कि StackOverflowException फेंक दिया गया था पर चल रहा था इकाई परीक्षण के नाम होने का सबसे आसान तरीका क्या है पाया? यहां तक ​​कि जब इकाई परीक्षण डिबगिंग मैं ढेर और विजुअल स्टूडियो के निचले भाग में अपनी के रूप में वर्तमान इकाई परीक्षण के नाम खोजने के लिए संघर्ष कर रहा हूँ अभ्यस्त 'डिबगिंग विंडो क्योंकि इसकी बहुत बड़ी में पूरे ढेर दिखाया गया है।

वहाँ किसी तरह जो इकाई परीक्षण का संग्रह और दुर्घटना डंप डिबगिंग के बिना विफल रहा है पता लगाने के लिए है?

+0

मुझे यकीन है कि क्या अपवाद छोटा है नहीं कर रहा हूँ। क्या आप घड़ी और/या इंटरमीडिएट विंडो में 'new System.Diagnostics.StackTrace (true) 'के साथ अपना स्वयं का स्टैकट्रैक बनाने का प्रयास कर सकते हैं? शायद यह आपको एक पूर्ण निशान प्रदान करेगा। – Caramiriel

+1

@ करमीरिल रनिंग करते हुए कि डीबगिंग इंटरैक्टिव रूप से 'अभिव्यक्ति का मूल्यांकन नहीं कर सकता है क्योंकि वर्तमान धागा एक स्टैक ओवरफ्लो स्टेटस में है।', आप क्रैश डंप को डिबग करते समय तत्काल अभिव्यक्ति नहीं चला सकते क्योंकि प्रक्रिया वास्तव में उस बिंदु पर नहीं चल रही है। पूरे स्टैक ट्रेस को दिखाया नहीं गया है क्योंकि इसकी विशालता है। – Justin

+0

@ जस्टिन: यदि आपका विजुअल स्टूडियो आर्किटेक्चर (उदाहरण के लिए x86) आपके एप्लिकेशन से मेल खाता है, तो आप तत्काल विंडो में '! Clrstack' टाइप करके एसओएस लोड कर सकते हैं और स्टैकट्रैक डंप कर सकते हैं। लगता है कि मेरे लिए काम कर रहा है। ('0028ed6c 00340147 ConsoleApplication45.Program.Rec() 0028edac 003400fb ConsoleApplication45.Program.Main (System.String [])') – Caramiriel

उत्तर

1

this other question में उल्लेख किया है, तुम सच में एक ढेर अतिप्रवाह अपवाद जब तक आप इसे अपने आप को फेंक नहीं पकड़ सकते।

तो, आपकी समस्या (वास्तव में नहीं एक समाधान) के लिए एक समाधान के रूप में आप एक ढेर अतिप्रवाह पता लगाने के लिए आप कोड में एक विधि कॉल सम्मिलित कर सकते हैं, तो मैन्युअल रूप से अपवाद फेंक और इसे बाद में पकड़।

[TestClass] 
public class TestStackOverflowDetection 
{ 
    [TestMethod] 
    public void TestDetectStackOverflow() 
    { 
     try 
     { 
      InfiniteRecursion(); 
     } 
     catch (StackOverflowException e) 
     { 
      Debug.WriteLine(e); 
     } 
    } 

    private static int InfiniteRecursion(int i = 0) 
    { 
     // Insert the following call in all methods that 
     // we suspect could be part of an infinite recursion 
     CheckForStackOverflow(); 

     // Force an infinite recursion 
     var j = InfiniteRecursion(i) + 1; 
     return j; 
    } 

    private static void CheckForStackOverflow() 
    { 
     var stack = new System.Diagnostics.StackTrace(true); 
     if (stack.FrameCount > 1000) // Set stack limit to 1,000 calls 
     { 
      // Output last 10 frames in the stack 
      foreach (var f in stack.GetFrames().Reverse().Take(30).Reverse()) 
       Debug.Write("\tat " + f); 

      // Throw a stack overflow exception 
      throw new StackOverflowException(); 
     } 
    } 
1

RuntimeHelpers.EnsureSufficientExecutionStack विधि (http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.runtimehelpers.ensuresufficientexecutionstack.aspx) पर एक नजर डालें। आप समय से पहले InsufficientExecutionStackException प्राप्त करने के लिए इसे अपने रिकर्सिव विधि (ओं) में कॉल करना चाह सकते हैं।

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