2009-06-04 21 views
8

Điều này có lẽ không thực tế, nhưng liệu có thể cho phép một thành phần được thông báo về tất cả các ngoại lệ cơ hội đầu tiên xảy ra trong quá trình của nó?.NET - Trình nghe ngoại lệ cơ hội đầu tiên để gỡ lỗi chuyên sâu?

Chúng tôi có một số thành phần của bên thứ ba (ký hợp đồng với chúng tôi) mà không làm bất cứ điều gì nhưng ăn ngoại lệ và chính trị của mối quan hệ kinh doanh làm cho toàn bộ thử thách một nỗi đau hoàng gia.

Chúng tôi cũng biết rằng một số mã của chúng tôi đang thực hiện hành động đáng thất vọng khi cho phép ngoại lệ biến mất vào vực thẳm thay vì sử dụng trình ghi nhật ký ngoại lệ tập trung của chúng tôi.

tôi giả sử ứng dụng của chúng tôi sẽ phải bắt đầu như là một tiến trình con của một ứng dụng gỡ lỗi để đạt được hiệu quả, nhưng tôi hình dung nó có giá trị hỏi :)

Trả lời

2

Net 4.0 thực sự đã thêm sự kiện AppDomain.FirstChanceException. Nó cháy trước khi bất kỳ khối catch nào được thực thi.

MSDN article này có một số ví dụ.

Về cơ bản bạn chỉ cần thêm một event handler như thế này:

AppDomain.CurrentDomain.FirstChanceException += 
     (object source, FirstChanceExceptionEventArgs e) => 
     { 
      Console.WriteLine("FirstChanceException event raised in {0}: {1}", 
       AppDomain.CurrentDomain.FriendlyName, e.Exception.Message); 
     }; 
+0

Rất đẹp! Cảm ơn nhiều vì đã gạt bỏ câu hỏi cũ này! – STW

7

Bạn có thể sử dụng API .net profiling để nhận thông báo của trường hợp ngoại lệ ở tất cả các loại tiểu bang, đây là các phương pháp có sẵn:

ExceptionThrown 
ExceptionSearchFunctionEnter 
ExceptionSearchFunctionLeave 
ExceptionSearchFilterEnter 
ExceptionSearchFilterLeave 
ExceptionSearchCatcherFound 
ExceptionOSHandlerEnter 
ExceptionOSHandlerLeave 
ExceptionUnwindFunctionEnter 
ExceptionUnwindFunctionLeave 
ExceptionUnwindFinallyEnter 
ExceptionUnwindFinallyLeave 
ExceptionCatcherEnter 
ExceptionCatcherLeave 
ExceptionCLRCatcherFound 
ExceptionCLRCatcherExecute 

Sử dụng api lược tả không hoàn toàn dành cho người yếu tim; có một cái nhìn tại http://msdn.microsoft.com/en-us/library/ms404386.aspx như là một điểm nhập cảnh cho nghiên cứu của bạn và http://msdn.microsoft.com/en-us/library/bb384687.aspx để xử lý ngoại lệ cụ thể.

Tôi không nhận thức được một cách đơn giản để làm điều đó trong mã quản lý của bạn như

AppDomain.FirstChanceException += new EventHandler... 

sự kiện hoặc tương đương.

CHỈNH SỬA: Thay vào đó có thể thay thế tốt hơn bằng cách sử dụng unamanaged debugging API.

Về cơ bản, bạn có thể đặt một cuộc gọi lại ICorManagedCallback/ICorManagedCallback2 bằng cách sử dụng ICorDebug::SetManagedHandler và nhận lại cuộc gọi lại khi có ngoại lệ.

Tôi không đủ kinh nghiệm trong lĩnh vực này để biết những ưu điểm/nhược điểm là gì trên api lược tả.

Tôi chỉ cần xem mdgb sample sử dụng API ICorDebug và dường như nhận được đủ thông báo từ trường hợp ngoại lệ (để xem nhanh sự kiện nào xảy ra, đặt điểm ngắt trong phương thức HandleEvent trong corapi/Debugger.cs: 406)

+0

Tôi không mong đợi nó sẽ dễ dàng, nhưng một đường trong là tất cả những gì cần để ít nhất có được một cảm giác về nó. Cảm ơn nhiều! – STW

+0

Tôi đã chỉnh sửa câu trả lời của mình sau khi chơi với mdbg, tôi tin rằng ICorDebug API có thể là một cách tốt hơn để làm điều đó. –

Các vấn đề liên quan