如何从用户的计算机获取有用的WPF .NET错误信息?

我有一个WPF应用程序崩溃了一旦我把它安装到没有安装开发环境的机器上 – 如果这是一个骗局,我欢迎关闭,但我的搜索function未能找到一个相同的问题。 看来我得到了一个XamlParseException,但没有比这更有用了。 我需要获得有用的信息。

浏览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 

我检查了那些目录,第一个不存在,而第二个包含一个只列出加载的dll的wer文件。

我可以在我的测试机器上安装一个开发环境,但是它无法成为一台测试机器,我又回到原点。 我没有在安装了开发环境时遇到此错误,因此我对如何获得详细,有用的错误消息感到茫然。

编辑:在下面建立@Alastair Pitts的评论,这是我填写exception处理的方式:

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

希望我能以这种方式得到我需要的东西。 谢谢您的帮助!

我将使用的过程是处理应用程序域中的UnhandledException 事件 。

完成后,您有很多选择。 将exception记录到文件中,将其序列化以供以后检查,显示带有exception消息的对话框。

编辑:在创建主窗口时发生XamlParseException 。 这意味着正在调用该窗口的构造函数。 如果在该构造函数中执行任何逻辑,则任何生成的exception都将抛出XamlParseException 。 据我所知, UnhandledException处理程序仍将捕获此exception。

要在WPF中连接UnhandledException事件,请在app.xaml中添加事件连接

  

然后在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

除了具有记录堆栈跟踪的未处理exception事件处理程序之外,查看在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 \微软\的Windows \ WER \ ReportQueue \ AppCrash_crashyapp.exe_56f8d710d72e31d822d6b895c5c43a18d34acfa1_cab_2823e614
    

该目录包含崩溃的hdmp和mdmp文件。 是时候连接调试器了!

exception记录(如Alastair Pitts的答案)将有助于归零错误的来源。

在P9行上存在XamlParse表明从XAML描述初始化控件或窗口可能存在问题。 可能存在由XAML引用的程序集,该程序集在目标计算机上找不到,或者与XAML中的签名不匹配。

编辑:

XAML解析发生在InitializeComponent()中,它在窗口或控件的构造函数中调用

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