2010-03-04 16 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(); 
    } 
} 
相关问题