C# 需要以编程方式捕获崩溃转储

C# 需要以编程方式捕获崩溃转储,c#,crash-dumps,unhandled-exception,C#,Crash Dumps,Unhandled Exception,我需要通过编程(C#)生成崩溃转储。我知道的唯一方法是订阅未处理的事件Exception。但是我的处理程序没有被击中。 代码如下: [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); AppDomain.Current

我需要通过编程(C#)生成崩溃转储。我知道的唯一方法是订阅未处理的事件Exception。但是我的处理程序没有被击中。 代码如下:

[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也会很有帮助。

首先显示一个表单,然后注册事件处理程序,然后
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());
}

请注意,在某些情况下,例如堆损坏或.NET执行引擎损坏,程序处于无法再执行任何有意义的操作的状态。在程序内部运行的异常处理程序总是受此影响。有关从程序外部捕获崩溃转储的方法,请参阅。

我找到了这个资源,可以很好地回答您的问题(据我所知),我想

它使用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);

作者提供了示例代码、地址,我目前无法访问,希望对您有所帮助

NET堆栈溢出异常如何?可以使用这段代码来处理吗?问题是我需要编写一段代码,该代码必须集成到在生产环境中部署的现有应用程序中。因此,每当此应用程序因任何异常而崩溃时,代码必须捕获转储。您共享的链接讨论了如何使用需要单独运行的外部工具。这是不可取的,因为我们需要对客户在使用应用程序期间发生的崩溃进行转储,并且崩溃可能不会非常频繁或更晚发生。WER LocalDumps不是必须运行的工具,它只是一个注册表项。它集成在操作系统中。正如我所说,您无法在应用程序中解决该问题。对于我们的一个应用程序,我完全删除了未处理的异常处理程序,因为它不能可靠地工作。