我需要以编程方式(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也会有所帮助。
答案 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地址,我暂时无法访问它,我希望它对您有所帮助。