2010-03-04 37 views
14

我有一個WPF應用程序崩潰,一旦我把它放到沒有安裝開發環境的機器上 - 如果這是一個騙局,我歡迎關閉,但我的搜索fu沒有找到一個等效的題。看來我得到一個XamlParseException,但沒有比這更有用。我需要得到有用的信息。如何從用戶的機器獲得有用的WPF .NET錯誤信息?

通過Windows 7的事件日誌去給我這個錯誤日誌:

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 

我檢查這些目錄,而第一不存在,而第二個包含WER文件,只是列出了加載dll。

我可以在我的測試機器上安裝一個開發環境,但它不能成爲一臺測試機器,我又回到了原點。我在安裝開發環境時沒有得到這個錯誤,所以我不知道如何獲得詳細而有用的錯誤消息。

編輯:建築關閉@Alastair皮茨評論的下方,這裏是我如何填寫異常處理:

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(); 
    } 

希望,我會得到什麼,我需要這樣。謝謝您的幫助!

回答

14

我將使用的過程是處理應用程序域中的UnhandledExceptionevent

一旦你這樣做了,你有很多選擇。將異常記錄到文件中,將其序列化以供日後檢查,並顯示包含異常消息的對話框。

編輯:XamlParseException發生在您的主窗口正在創建時。這意味着該窗口的構造函數正在被調用。如果您在該構造函數中執行任何邏輯,則任何生成的異常將拋出一個XamlParseException。這是我的理解,UnhandledException處理程序仍將捕獲此異常。

掛鉤在WPF的UnhandledException事件,添加事件聯播在App.xaml中

<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" /> 

,然後添加一個方法,在你的app.cs

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

如果ITIS一個XamlParseError,似乎會發生這樣的錯誤之前,我可以使用任何代碼,只需在應用程序窗口的繪製。在用戶代碼被調用之前有沒有辦法跟蹤這個異常?或者我錯了XamlParseErrors? – mmr

1

異常記錄(如Alastair Pitts的答案)將有助於糾正錯誤的來源。

P9行上XamlParse的存在表明從XAML描述初始化控件或窗口時可能存在問題。可能存在由目標計算機上未找到的XAML引用的程序集,或者與XAML中的簽名不匹配。

編輯:發生在的InitializeComponent(),它是所謂的窗口或控制的構造

XAML解析

2

除了具有未處理的異常事件處理程序,記錄該堆棧跟蹤,它也是有助於查看在repro機器上生成的崩潰轉儲。你提到它的Windows 7,這樣你就可以找相應的崩潰在以下幾個方面轉儲:

  1. 控制面板 - >所有控制面板項 - >行動中心 - >「查看問題報告」鏈接的維護之下/「檢查未報告問題的解決方案」區域。這會彈出一個已經崩潰的應用程序列表,您可以深入瞭解它們以查找轉儲文件和信息。請在問題技術詳細信息的左下角查找「查看這些文件的臨時副本」鏈接。這將提取轉儲文件並在資源管理器窗口中顯示給您。

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

WER似乎保持它是目錄下崩潰轉儲,所以我做的是對,我知道將會有應用程序名稱的一部分DIR/S/B。例如,我製作了一個名爲crashyapp.exe的故意應用程序:

 
C:\ProgramData\Microsoft\Windows\WER>dir /s/b *crashy* 
C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_crashyapp.exe_56f8d710d72e31d822d6b895c5c43a18d34acfa1_cab_2823e614 
該目錄包含崩潰的hdmp和mdmp文件。時間去附加一個調試器!

+0

有趣的想法。自那時以來,我一直在從這個問題轉移到公司,但我可以把它傳達給我仍然在努力解決這個問題的一些朋友。看來WPF錯誤幾乎總是XamlParseExceptions,所以除此之外的任何信息都是有用的。 – mmr

0

除了Alistair的答案,那就是給了我,我一直在尋找線索的InnerException:

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(); 
    } 
} 
相關問題