2010-03-04 31 views
14

Tôi có một ứng dụng WPF gặp sự cố khi tôi đưa nó lên các máy không có môi trường phát triển được cài đặt-- nếu đây là một bản dupe, tôi được chào đón để đóng, nhưng tôi không tìm được trang tương đương câu hỏi. Có vẻ như tôi đang nhận được XamlParseException, nhưng không có gì hữu ích hơn thế. Tôi cần lấy thông tin hữu ích.Làm thế nào tôi có thể nhận được thông tin lỗi WPF .NET hữu ích từ máy của người dùng?

Đi qua Windows 7 bản ghi sự kiện mang lại cho tôi log lỗi này:

Fault bucket , type 0 
Event Name: CLR20r3 
Response: Not available 
Cab Id: 0 

Problem signature: 
P1: MyApp.exe 
P2: 1.0.0.0 
P3: 4b88323d 
P4: PresentationFramework 
P5: 3.0.0.0 
P6: 4a174fbc 
P7: 624f 
P8: e1 
P9: System.Windows.Markup.XamlParse 
P10: 

Attached files: 
C:\Users\Mark\AppData\Local\Temp\WER7DC.tmp.WERInternalMetadata.xml 

These files may be available here: 
C:\Users\Mark\AppData\Local\Microsoft\Windows\WER\ReportArchive 
\AppCrash_generatortestbed_4fa7dff09a9e893eb675f488392571ced4ac8_04ef1100 

Analysis symbol: 
Rechecking for solution: 0 
Report Id: cd55060c-271f-11df-b6ff-001e52eefb8e 
Report Status: 1 

Tôi đã kiểm tra những thư mục, và là người đầu tiên không tồn tại, trong khi thứ hai chứa một tập tin wer mà chỉ liệt kê các nạp dlls.

Tôi có thể cài đặt môi trường phát triển trên máy thử nghiệm của mình, nhưng sau đó nó không thể là máy thử nghiệm và tôi quay lại hình vuông. Tôi không nhận được lỗi này với môi trường dev được cài đặt, vì vậy tôi đang thua lỗ về cách nhận thông báo lỗi hữu ích, tiết kiệm.

EDIT: xây dựng tắt của comment @Alastair Pitts' bên dưới, dưới đây là cách tôi điền vào việc xử lý ngoại lệ:

private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { 
     Exception theException = e.Exception; 
     string theErrorPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\GeneratorTestbedError.txt"; 
     using (System.IO.TextWriter theTextWriter = new System.IO.StreamWriter(theErrorPath, true)){ 
      DateTime theNow = DateTime.Now; 
      theTextWriter.WriteLine("The error time: " + theNow.ToShortDateString() + " " + theNow.ToShortTimeString()); 
      while (theException != null) { 
       theTextWriter.WriteLine("Exception: " + theException.ToString()); 
       theException = theException.InnerException; 
      } 
     } 
     MessageBox.Show("The program crashed. A stack trace can be found at:\n" + theErrorPath); 
     e.Handled = true; 
     Application.Current.Shutdown(); 
    } 

Hy vọng rằng, tôi sẽ nhận được những gì tôi cần theo cách này. Cảm ơn đã giúp đỡ!

Trả lời

14

Quy trình tôi sẽ sử dụng là xử lý UnhandledExceptionevent trong miền ứng dụng.

Khi bạn đã làm điều đó, bạn có một số tùy chọn. Ghi lại ngoại lệ cho một tệp, nối tiếp nó để kiểm tra sau, hiển thị hộp thoại có thông báo ngoại lệ.

CHỈNH SỬA: XamlParseException xảy ra khi cửa sổ chính của bạn đang được tạo. Điều này có nghĩa là hàm tạo của cửa sổ đó đang được gọi. Nếu bạn thực hiện bất kỳ logic nào trong hàm tạo đó, mọi ngoại lệ kết quả sẽ ném một số XamlParseException. Đó là sự hiểu biết của tôi rằng trình xử lý UnhandledException vẫn sẽ bắt ngoại lệ này.

Để treo lên các sự kiện UnhandledException trong WPF, thêm hookup sự kiện trong App.xaml bạn

<Application 
    x:Class="DispatcherUnhandledExceptionSample.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    StartupUri="MainWindow.xaml"  
    DispatcherUnhandledException="App_DispatcherUnhandledException" /> 

mà sau đó bổ sung thêm một phương pháp trong app.cs bạn

public partial class App : Application 
{ 
    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    { 
     // Process unhandled exception do stuff below 

     // Prevent default unhandled exception processing 
     e.Handled = true; 
    } 
} 

MSDN

+0

Nếu ITIS một XamlParseError, dường như lỗi đó sẽ xảy ra trước khi tôi có thể sử dụng bất kỳ mã, chỉ trong bản vẽ của cửa sổ ứng dụng. Có cách nào để theo dõi ngoại lệ này trước khi mã người dùng được gọi không? Hay tôi sai về XamlParseErrors? – mmr

1

Ghi nhật ký ngoại lệ (như trong câu trả lời từ Alastair Pitts) sẽ là một trợ giúp trong việc đánh số không vào nguồn của lỗi.

Sự hiện diện của XamlParse trên dòng P9 cho thấy có thể có sự cố khi khởi chạy điều khiển hoặc cửa sổ từ mô tả XAML. Có thể có một hội đồng được tham chiếu bởi XAML mà không được tìm thấy trên máy tính đích, hoặc không khớp với chữ ký trong XAML.

Edit:

XAML phân tích xảy ra trong InitializeComponent() được gọi trong các nhà xây dựng của cửa sổ hoặc kiểm soát

2

Ngoài việc có một event handler ngoại lệ unhandled mà các bản ghi stack trace, nó cũng là hữu ích để xem xét các bãi tai nạn được tạo ra trên máy repro.Bạn đã đề cập đến đó là Windows 7, vì vậy bạn có thể tìm kiếm các bãi đổ rác tương ứng theo các cách sau:

  1. Bảng điều khiển ->/"Kiểm tra các giải pháp cho các vấn đề không được báo cáo" khu vực. Điều này sẽ trả về một danh sách các ứng dụng đã gặp sự cố và bạn có thể đi sâu vào chúng để tìm các tệp kết xuất và thông tin. Tìm liên kết "Xem bản sao tạm thời của những tệp này" ở phía dưới cùng bên trái của chi tiết kỹ thuật sự cố. Thao tác này sẽ trích xuất các tệp kết xuất và hiển thị chúng cho bạn trong cửa sổ trình khám phá.

  2. cd/d% ProgramData% \ Microsoft \ Windows \ WER.

WER dường như giữ nguyên các vùng đổ vỡ bên dưới thư mục đó, vì vậy điều tôi làm là thư mục/s/b cho tên ứng dụng mà tôi biết sẽ ở đó. Ví dụ, tôi đã tạo một ứng dụng có mục đích bị lỗi mà tôi gọi là crashyapp.exe:

 
C:\ProgramData\Microsoft\Windows\WER>dir /s/b *crashy* 
C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_crashyapp.exe_56f8d710d72e31d822d6b895c5c43a18d34acfa1_cab_2823e614 
Thư mục đó chứa tệp hdmp và mdmp cho sự cố. Đã đến lúc lấy một trình gỡ rối!

+0

Ý tưởng thú vị. Tôi đã chuyển từ công ty mà đây là một vấn đề, nhưng tôi có thể chuyển nó lại cho một số người bạn của tôi, những người vẫn đang đấu tranh với vấn đề này. Dường như các lỗi WPF hầu như luôn luôn XamlParseExceptions, vì vậy bất kỳ thông tin nào khác ngoài thông tin đó đều hữu ích. – mmr

0

Ngoài câu trả lời Alistair, nó là InnerException đó đã cho tôi những manh mối tôi đang tìm kiếm:

public partial class App : Application { 
    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { 
     Exception ex = e.Exception; 
     Exception ex_inner = ex.InnerException; 
     string msg = ex.Message + "\n\n" + ex.StackTrace + "\n\n" + 
      "Inner Exception:\n" + ex_inner.Message + "\n\n" + ex_inner.StackTrace + "\n\n" + 
      Utils.RegistryVersion(); 
     MessageBox.Show(msg, "Drop Print Batch Application Halted!", MessageBoxButton.OK); 
     Utils.MailReport(msg); 
     e.Handled = true; 
     Application.Current.Shutdown(); 
    } 
} 
Các vấn đề liên quan