我有一个WPF应用程序崩溃了一旦我把它安装到没有安装开发环境的机器上 - 如果这是一个骗局,我欢迎关闭,但我的搜索功能未能找到同等的问题。我似乎得到了一个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评论,这是我填写异常处理的方式:
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();
}
希望我能以这种方式得到我需要的东西。谢谢你的帮助!
答案 0 :(得分:15)
我将使用的程序是处理应用域中的UnhandledException
event。
完成后,您有很多选择。将异常记录到文件中,将其序列化以供以后检查,显示带有异常消息的对话框。
编辑: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;
}
}
答案 1 :(得分:2)
除了具有记录堆栈跟踪的未处理异常事件处理程序之外,查看在repro计算机上生成的故障转储也很有用。您提到它是Windows 7,因此您可以通过以下方式查找相应的故障转储:
控制面板 - &gt;所有控制面板项目 - &gt;行动中心 - &gt;维护/“检查未报告问题的解决方案”区域下方的“查看要报告的问题”链接。这将显示已崩溃的应用程序列表,您可以深入查看它们以查找转储文件和信息。查找问题技术详细信息左下角的“查看这些文件的临时副本”链接。这将提取转储文件并在资源管理器窗口中显示给您。
cd / d%ProgramData%\ Microsoft \ Windows \ WER。
C:\ProgramData\Microsoft\Windows\WER>dir /s/b *crashy* C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_crashyapp.exe_56f8d710d72e31d822d6b895c5c43a18d34acfa1_cab_2823e614该目录包含崩溃的hdmp和mdmp文件。是时候连接调试器了!
答案 2 :(得分:1)
异常记录(如Alastair Pitts的回答)将有助于归零错误源。
在P9行上存在XamlParse表明从XAML描述初始化控件或窗口可能存在问题。 XAML引用的程序集可能在目标计算机上找不到,或者与XAML中的签名不匹配。
编辑:
XAML解析发生在InitializeComponent()中,在窗口或控件的构造函数中调用
答案 3 :(得分: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();
}
}