2013-03-11 33 views
14

Bất cứ khi nào kiểm tra đơn vị không thành công do StackOverflowException quá trình kiểm tra đơn vị thoát ngay lập tức - cách duy nhất để tìm hiểu điều gì đã xảy ra (tôi biết) là gỡ lỗi bãi chứa sự cố của quá trình kiểm tra đơn vị thu được bằng cách làm theo các bước tìm thấy ở đâyGỡ lỗi đơn vị kiểm tra thất bại do một ngoại lệ StackOverflow

cách dễ nhất để nhận được tên của bài kiểm tra đơn vị đã được chạy ở thời gian mà StackOverflowException bị ném là gì? Ngay cả khi gỡ lỗi kiểm tra đơn vị tôi đang đấu tranh để tìm tên của bài kiểm tra đơn vị hiện tại như nó ở dưới cùng của ngăn xếp và Visual Studio sẽ không hiển thị toàn bộ ngăn xếp trong cửa sổ gỡ lỗi vì nó quá lớn.

Có cách nào để tìm ra thử nghiệm đơn vị nào không thành công mà không thu thập và gỡ lỗi các bãi rác?

+0

Tôi không chắc chắn về việc cắt xén ngoại lệ là gì. Bạn có thể thử tạo stacktrace của riêng bạn với 'System.Diagnostics.StackTrace (true)' mới trong đồng hồ và/hoặc cửa sổ trung gian không? Có lẽ điều này sẽ cung cấp cho bạn một dấu vết đầy đủ. – Caramiriel

+1

@Caramiriel Chạy trong khi gỡ lỗi tương tác cho 'Không thể đánh giá biểu thức vì luồng hiện tại đang ở trạng thái tràn ngăn xếp.', bạn không thể chạy biểu thức ngay lập tức khi gỡ lỗi kết xuất đổ vỡ vì quá trình này không thực sự chạy tại điểm đó. Toàn bộ dấu vết ngăn xếp không được hiển thị vì khối lượng lớn của nó. – Justin

+0

@Justin: Nếu kiến ​​trúc studio trực quan của bạn (ví dụ x86) khớp với ứng dụng của bạn, thì bạn cũng có thể tải SOS và kết xuất stacktrace bằng cách gõ '! Clrstack' vào cửa sổ ngay lập tức. Dường như làm việc cho tôi. ('0028ed6c 00340147 ConsoleApplication45.Program.Rec() 0028edac 003400fb ConsoleApplication45.Program.Main (System.String [])') – Caramiriel

Trả lời

1

Như đã đề cập trong this other question, bạn không thể thực sự bắt được ngoại lệ tràn ngăn xếp trừ khi bạn tự mình ném.

Vì vậy, như một cách giải quyết cho vấn đề của bạn (không phải thực sự là một giải pháp), bạn có thể chèn một lời gọi phương thức trong mã bạn để phát hiện một chồng tràn, sau đó ném ngoại lệ bằng tay và bắt nó sau này.

[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(); 
     } 
    } 
Các vấn đề liên quan