3

在我的 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() 

堆栈跟踪来自 Windows 事件查看器。(未处理的异常处理程序没有得到它。)

我在 SO 上阅读了很多关于此的文章:

事实证明,我的应用程序在某个地方通过本机方法访问已处理或损坏的内存。我现在的问题是如何使用我使用任务管理器制作的故障转储找到该位置。是否有其他策略可以找到原因?

4

3 回答 3

1

我发现UnhandledExceptionandThreadException事件通常不会在 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
}
于 2015-02-10T11:01:29.467 回答
0

我以这个奇妙的工具结束:Microsoft 的“调试诊断工具”。请参阅CodeProject上的详细信息

“调试诊断工具 (DebugDiag) 旨在帮助解决诸如挂起、性能下降、内存泄漏或碎片以及任何用户模式进程中的崩溃等问题。” (microsoft.com) 与其他调试工具相比,DebugDiag 工具的使用要简单得多。

该工具自动监控特定进程并将转储文件保存到可选文件夹中。很方便 ;-)

于 2015-02-10T09:24:27.520 回答
0

使用 SOS 并打破第一个未处理的异常并从那里开始可能会有所帮助。

如果需要,您还可以动态启动调试器。请参阅“系统诊断”。

这将允许您对导致或允许发生异常的条件进行概览,并能够在附加调试器时无需等待错误发生就能够遵循它。

于 2015-02-06T13:56:53.557 回答