2012-04-18 30 views
14

Tôi mới sử dụng C#. Tôi đang viết một ứng dụng dựa trên mẫu máy tính để bàn nhỏ và tôi cần có tính năng này trong ứng dụng.Trong C# cách thu thập dấu vết ngăn xếp của sự cố chương trình

Nếu ứng dụng bị treo bất cứ lúc nào, cần có một cơ hội cuối cùng cho các ứng dụng để thu thập dấu vết ngăn xếp và gửi nó lại cho tôi ...

Xin vui lòng cho tôi hướng về điều này.

Tôi có cần thử nắm bắt chính điểm nhập của ứng dụng của mình không ?? hoặc cách tốt nhất để xử lý những thứ như vậy trong ứng dụng C# là gì.

cảm ơn bạn,

+2

tính năng "điện thoại tại nhà" của các chương trình cần được thiết kế cẩn thận. Đảm bảo bạn cảnh báo người dùng và xem xét dữ liệu nào bạn không nên nhận (mật khẩu, tên, cực kỳ cẩn thận nếu nó có thể chứa thông tin về trẻ em). Kiểm tra điều này - [Báo cáo lỗi Windows: Bắt đầu] (http://msdn.microsoft.com/en-us/windows/hardware/gg487440), ít nhất là liên kết bảo mật. –

Trả lời

22

Để bắt tất cả các trường hợp ngoại lệ unhandled, Thêm phần này vào program.cs:

[STAThread] 
    static void Main() 
    { 
    AppDomain currentDomain = default(AppDomain); 
    currentDomain = AppDomain.CurrentDomain; 
    // Handler for unhandled exceptions. 
    currentDomain.UnhandledException += GlobalUnhandledExceptionHandler; 
    // Handler for exceptions in threads behind forms. 
    System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler; 
    ... 
    } 

private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) 
{ 
    Exception ex = default(Exception); 
    ex = (Exception)e.ExceptionObject; 
    ILog log = LogManager.GetLogger(typeof(Program)); 
    log.Error(ex.Message + "\n" + ex.StackTrace); 
} 

private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e) 
{ 
    Exception ex = default(Exception); 
    ex = e.Exception; 
    ILog log = LogManager.GetLogger(typeof(Program)); //Log4NET 
    log.Error(ex.Message + "\n" + ex.StackTrace); 
} 

Stack trace bạn có thể nhận được bằng exception.StackTrace

+2

cảm ơn câu trả lời. Tôi đang so sánh câu trả lời của bạn với Lynn Crumbling và tôi tự hỏi lợi ích của phương pháp này so với của anh ấy là gì ..? – Ahmed

+4

@ user1185422 Cách tiếp cận của Aseem là một giải pháp toàn cầu và sẽ bắt kịp ngay cả lỗi thời gian khởi động, ngoại lệ nội bộ .NET, lỗi hoạt động không đồng bộ, vv. Cách tiếp cận của Lynn là phương pháp cục bộ và chỉ bắt ngoại lệ bên trong các phương thức được gọi từ 'MainEntryPoint' * * đồng bộ **. Tôi sẽ không đề nghị phương pháp tiếp cận Lynn là giải pháp báo cáo sự cố vì bạn có thể bỏ lỡ toàn bộ các lớp lỗi. –

+2

cố gắng nắm bắt khối là tốt, nhưng gói mỗi dòng mã bên trong một try-catch có thể được tẻ nhạt, cộng với có thể có ngoại lệ do thư viện của bên thứ ba, cách tiếp cận này giải quyết hai vấn đề là tốt. Bạn có thể tiếp tục với phương pháp tiếp cận khối try-catch, thậm chí sau đó điều này là hoàn toàn cần thiết. –

1

Nếu bạn quấn của bạn mã trong một try-catch, và một Exception xảy ra, bạn có thể nhận được tại Exception để xem stack trace. Có, bạn sẽ thêm một try-catch để bọc điểm vào chính của bạn.

try 
{ 
    MainEntryPoint(); 
} 
catch (Exception exc) 
{ 
    System.Diagnostics.Debug.Print(exc.Message); // get at entire error message w/ stacktrace 
    System.Diagnostics.Debug.Print(exc.StackTrace); // or just the stacktrace 
} 
+0

Tôi rất muốn biết những lợi ích nào khi đăng ký vào UnhandledException đã sử dụng cách tiếp cận này. –

+2

Có, tôi đang cố gắng tìm một lý do để sử dụng phương pháp đó trong trường hợp này. Có lẽ nó có thể bắt ngoại lệ cho các chủ đề không phải UI khác trong ứng dụng? Tôi không chắc chắn nếu giải pháp của bạn bắt ngoại lệ cho các chủ đề khác là tốt .. – Ahmed

3

Nếu tôi là bạn, tôi sẽ xem xét một giải pháp tất cả-trong-một, như khuôn khổ NBug miễn phí và mã nguồn mở,

http://nbug.codeplex.com/

+0

Đã dành 30 phút sử dụng các mẫu được cung cấp của nó .. Ngay cả ứng dụng cấu hình mẫu bị hỏng một chút .. Ý tưởng có vẻ tuyệt vời mặc dù .. – Ahmed

3

Hãy nhìn vào Crypto Obfuscator trong đó có một tính năng Automatic Exception Reporting.

Báo cáo ngoại lệ tự động giúp bạn dễ dàng nắm bắt bất kỳ ngoại lệ không được xử lý nào xảy ra trong phần mềm của bạn và để người dùng dễ dàng báo cáo các ngoại lệ này cho bạn chỉ bằng một cú nhấp chuột.

Báo cáo ngoại lệ bao gồm tất cả thông tin thích hợp bao gồm thông tin theo dõi ngăn xếp đầy đủ cùng với giá trị của tất cả đối số phương pháp và biến cục bộ, cộng với thông tin hệ thống, thời gian ngoại lệ, số bản dựng và dữ liệu tùy chỉnh do nhà phát triển xác định các tệp nhật ký, ảnh chụp màn hình, v.v.

TUYÊN BỐ TỪ CHỐI: Tôi làm việc cho Phần mềm LogicNP, nhà phát triển của Công cụ kiểm soát mật mã.

+1

Có những thương mại tương tự khác các công cụ, chẳng hạn như SmartAssembly của Red-Gate, http://www.red-gate.com/products/dotnet-development/smartassembly/ :) –

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