dump文件相信有些朋友已经很熟悉了,dump文件的作用在于保存进程运行时的堆栈信息,方便日后排查软件故障,提升软件质量。关于dump分析工具windbg、adplus的文章更多了,如果您还不知道怎么使用请移步:
使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题
这里接我的上篇文章:送专利啦~~ .Net高阶异常处理之TopLevelEH 继续讲,捕捉到异常之后我们该怎么办。
一般来讲,我们想知道当时程序崩溃的相关信息,同时弹出友好对话框,当用户点击OK后关闭程序。简陋的讲就像这样:
MessageBox.Show("程序崩溃啦。。");
Environment.Exit(Environment.ExitCode);
那么最关键的事情来了,怎么记录程序崩溃的相关dump信息呢?!
强势引入:dbghelp.dll。它是微软Debug Help Library库的一部分,它包含了一套支持调试程序,让您在移植可执行(PE)格式的可执行映像的工作。更多信息请移步MSDN。
调用它,您就可以直接生成Dump文件,记录程序当时的运行镜像。
它的方法API如下:
[DllImport("dbghelp.dll", EntryPoint = "MiniDumpWriteDump", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] static extern bool MiniDumpWriteDump(IntPtr hProcess, uint processId, SafeHandle hFile, uint dumpType, ref MiniDumpExceptionInformation expParam, IntPtr userStreamParam, IntPtr callbackParam);
// Overload supporting MiniDumpExceptionInformation == NULL
[DllImport("dbghelp.dll", EntryPoint = "MiniDumpWriteDump", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
static extern bool MiniDumpWriteDump(IntPtr hProcess, uint processId, SafeHandle hFile, uint dumpType, IntPtr expParam, IntPtr userStreamParam, IntPtr callbackParam);
如何使用呢?!好吧,我知道大家都喜欢偷懒,我已经写成了类,大家直接调用一下就OK了。就像这样:
MiniDumpHelper.Write(@"C:\1.dmp", MiniDumpHelper.Option.WithFullMemoryInfo);
无图无真相,对比下未使用TopLevelEH前的程序:
和使用TopLevelEH后:
这里得提醒一下,调试模式是无效的,具体看我的上一篇。好了,接下来有了Dump文件,一切都好办了。对吧?!
源代码奉上:点我下载。
|