C#Winforms:调试策略以查找System.AccessViolationException的原因

时间:2015-02-06 13:47:50

标签: c# .net winforms debugging windb

在我的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创建的故障转储来查找该位置。 是否有其他策略可以找到原因?

3 个答案:

答案 0 :(得分:1)

我发现UnhandledExceptionThreadException事件通常不会在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保存到可选文件夹中。非常方便; - )