2010-04-27 32 views
21

Tôi đang gỡ lỗi một vấn đề đồng thời rõ ràng trong một ứng dụng lớn mà tôi hack vào công việc. Lỗi trong câu hỏi chỉ hiển thị trên một số máy hiệu suất thấp nhất sau khi chạy trong nhiều (12+) giờ và tôi chưa bao giờ sao chép nó trong trình gỡ rối. Bởi vì điều này, các công cụ gỡ lỗi của tôi về cơ bản bị hạn chế trong việc phân tích các tệp nhật ký.Tôi có thể lấy dấu vết ngăn xếp của tất cả các chuỗi trong ứng dụng C# của mình không?

C# giúp dễ dàng nhận được dấu vết ngăn xếp của chuỗi gửi ngoại lệ, nhưng tôi muốn thêm dấu vết ngăn xếp của mỗi chuỗi khác hiện đang thực hiện trong AppDomain của tôi tại thời điểm ngoại lệ được ném.

Điều này có khả thi không?

+3

Tôi chỉ đang tìm kiếm một cái gì đó như thế này bản thân mình vào ngày khác (và đến khi câu hỏi này: http://stackoverflow.com/questions/190236/how-do-i-make-a-thread-dump-in- net-a-la-jvm-thread-dumps). Có vẻ như bạn có thể không may mắn, nhưng vẫn tốt để xem những người trả lời câu hỏi đó phải nói gì. –

+0

Cảm ơn Dan, tôi đã lấy một số nội dung khá hữu ích từ câu hỏi được liên kết của bạn ... –

Trả lời

5

Có một công cụ trên CodePlex được gọi là Managed Stack Explorer (mà tôi tin là có nguồn gốc từ Microsoft). Nó sử dụng API gỡ rối và lược tả để nắm bắt các dấu vết ngăn xếp của các luồng trong một ứng dụng .Net đang chạy mà không cần sửa đổi ứng dụng.

Bạn có thể chạy ứng dụng của mình cho đến khi bạn gặp sự cố, sau đó phân tích nó bằng công cụ này để nắm bắt các dấu vết ngăn xếp hiện tại của tất cả các chuỗi đang chạy. Lợi ích của phương pháp này là bạn rời khỏi ứng dụng của bạn chưa sửa đổi (thiết bị có thể thay đổi hành vi của nó), và công cụ này là miễn phí.

+0

Điều này trông giống như giải pháp tốt nhất. Nó sẽ chắc chắn là tốt đẹp nếu khuôn khổ hỗ trợ nó tự nhiên trong ngôn ngữ, mặc dù ... –

+4

Đừng nghĩ rằng điều này được hỗ trợ trong .NET4 nữa, ngay cả các ứng dụng mẫu không hiển thị trong danh sách trên PC với cài đặt .NET4 . – angularsen

4

tôi khuyên bạn nên bãi chứa của quá trình này khi ngoại lệ xảy ra. Trong cùng một vị trí mà bạn đang đăng nhập ngoại lệ, hãy gọi phương thức MakeDumpFile() như dưới đây.

Giả sử bạn đã cài đặt Debugging Tools For Windows trên máy có vấn đề.

private static void MakeDumpFile() 
    {    
     int pid = Process.GetCurrentProcess().Id; 
     Console.WriteLine("Creating dump for pid " + pid); 

     //path to adplus executable; ensure you have Debugging tools installed; 
     string program = @"C:\Program Files (x86)\Debugging Tools for Windows (x86)\adplus.exe"; 

     //args for adplus; ensure the crashdump folder exists! 
     string args = string.Format(@"-hang -p {0} -o c:\crashdump", pid); 

     var startInfo = new ProcessStartInfo(program, args); 
     startInfo.UseShellExecute = false; 
     startInfo.ErrorDialog = false; 
     startInfo.CreateNoWindow = true; 
     startInfo.RedirectStandardOutput = true; 

     var process = Process.Start(startInfo); 
     Console.WriteLine("The following is output from adplus"); 
     Console.WriteLine(process.StandardOutput.ReadToEnd()); 
     Console.WriteLine("Finished creating dump."); 
    } 

Điều hướng đến thư mục kết xuất và bạn sẽ thấy một thư mục mới có tệp có tên FULLDUMP_something_.dmp.

Nếu bạn đang ở trên .NET4 bạn chỉ có thể kéo tên này vào VS2010 và kiểm tra tất cả các chủ đề hoặc sử dụng đề song song để xem những gì đang xảy ra (điều này là tuyệt vời!)

Nếu trên NET3.5 hoặc sớm hơn bạn sẽ cần phải sử dụng windbg để phân tích. Sử dụng lệnh sau

~ * e! Clrstack

để in callstack của tất cả các chuỗi được quản lý. Nếu bạn cần thêm trợ giúp, hãy tải bài đăng về windbg hoặc google để có hướng dẫn.

+0

Khi tôi cài đặt các công cụ gỡ lỗi, tôi thấy đường dẫn cài đặt là: C: \ Program Files \ Windows Kits \ 8.1 \ Debuggers \ x86 – Charlie

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