在我的winforms应用程序中,我随机出现以下异常:
Application: My.Shell.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
Stack:
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG ByRef)
at System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr, Int32, Int32)
at System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext)
at System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext)
at System.Windows.Forms.Application.Run(System.Windows.Forms.Form)
at Microsoft.Practices.CompositeUI.WinForms.FormShellApplication`2[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Start()
at Microsoft.Practices.CompositeUI.CabApplication`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Run()
at My.Shell.ModuleLoader.Main()
stacktrace来自windows event-viewer。 (unandeled异常处理程序没有得到它。)
我在SO上阅读了很多关于此事的文章:
事实证明,我的应用程序somwhere通过本机方法访问已处置或损坏的内存。我现在的问题是如何使用我使用taskmanager创建的故障转储来查找该位置。 是否有其他策略可以找到原因?
答案 0 :(得分:1)
我发现UnhandledException
和ThreadException
事件通常不会在WinForms中触发。在我的应用程序中,我有三种不同的方法来捕获未处理的异常。通常它只是获得它的try catch
。
static void Main(string[] args)
{
Application.ThreadException += Application_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
try
{
var mform = new MainForm();
Application.Run(mform);
}
catch (Exception ex)
{
HandleException(ex);
}
}
private void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
HandleException(e.Exception);
}
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
HandleException(e.ExceptionObject as Exception);
}
private void HandleException(Exception ex)
{
// Do something with it
}
答案 1 :(得分:0)
这可能有助于使用SOS并打破第一个未处理的异常并从那里开始。
如果需要,您还可以动态启动调试器。请参阅'System.Diagnostics'。
这将允许您概述导致或允许异常发生的条件,并且能够在不等待附加调试器时发生错误的情况下遵循它。
答案 2 :(得分:0)
我结束了这个奇妙的工具:"调试诊断工具"来自微软。查看有关CodeProject
的详细信息"调试诊断工具(DebugDiag)旨在帮助 解决诸如挂起,性能降低,内存泄漏等问题 或碎片,并在任何用户模式过程中崩溃。" (microsoft.com)与使用相比,DebugDiag工具使用起来要简单得多 其他调试工具。
该工具自动监视特定进程并将dumpfile保存到可选文件夹中。非常方便; - )