需要以编程方式捕获故障转储

时间:2017-02-28 07:32:05

标签: c# crash-dumps unhandled-exception

我需要以编程方式(C#)生成崩溃转储。我知道的唯一方法是订阅事件UnhandledException。但是我的处理程序不会被击中。 代码如下:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    Application.ThreadException += Application_ThreadException;
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
}

应用程序是基于WinForm的。我需要生成完整的内存转储,而不向用户显示任何操作。使用的API是Dbghelp的API,但它只生成小型转储。因此,了解任何其他可以生成完整内存转储的API也会有所帮助。

2 个答案:

答案 0 :(得分:0)

首先显示一个表单,然后注册事件处理程序,然后Main()方法结束。在最后3行代码中不会发生异常。像这样重新排序代码:

[STAThread]
static void Main()
{
    // Prepare for exception handling
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    Application.ThreadException += Application_ThreadException;
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    // Now do the work where exceptions can happen
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

请注意,在某些情况下,例如stack overflow,堆损坏或.NET执行引擎损坏,程序处于无法再执行任何有意义的状态。在程序内部运行的异常处理程序始终受此影响。有关从程序外部捕获故障转储的方法,请参阅How to take a good crash dump for .NET

答案 1 :(得分:0)

我发现这个资源可以解答你的问题(据我所知)。我认为its by an MS employee named Alex

它使用windows API调用:

[DllImportAttribute("dbghelp.dll")]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
private static extern bool MiniDumpWriteDump(
    [In] IntPtr hProcess,
    uint ProcessId,
    SafeFileHandle hFile,
    DumpType DumpType,
    [In] IntPtr ExceptionParam,
    [In] IntPtr UserStreamParam,
    [In] IntPtr CallbackParam);

作者提供了示例代码,this地址,我暂时无法访问它,我希望它对您有所帮助。

相关问题