.Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter

dump文件相信有些朋友已经很熟悉了,dump文件的作用在于保存进程运行时的堆栈信息,方便日后排查软件故障,提升软件质量。关于dump分析工具windbg、adplus的文章更多了,如果您还不知道怎么使用请移步:

使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题

ADPlus简介

这里接我的上篇文章:送专利啦~~ .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文件,一切都好办了。对吧?!

源代码奉上:点我下载

时间: 2024-10-12 08:36:47

.Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter的相关文章

送专利啦~~ .Net高阶异常处理之TopLevelEH

我们知道,.Net的应用程序运行在.net framework虚拟机上,对于在运行时发生的错误,我们有try...catch可以捕捉,实在不济,对于winform和asp.net 我们都有全局的事件可以订阅处理.具体请参见:http://www.cnblogs.com/eaglet/archive/2009/02/17/1392191.html ,但是如果不通过.net Framework,而是直接通过P/Invoke调用操作系统的C/C++写的库,而不是通过.Net Framework的BCL

keepalived高可用系列~第二篇文章

简介:今天搭建下mycat的高可用架构 一 准备环境: 1 两台配置相同的mycat,准备做负载均衡 2 两台安装lvs+keeplived的服务器,准备做高可用 3 两台mysql单实例,做分片集群 二  IP叙述 mycat1  192.168.1.1 keepalived1 192.168.1.3 mysql1 192.168.1.5 VIP 192.168.1.8 mycat2  192.168.1.2 keepalived2 192.168.1.4 mysql2 192.168.1.6

「C语言回顾之旅」第二篇:指针详解进阶

说明: 第一篇回顾了指针的基本概念以及基本使用,因此对指针也有了一个较为清晰的思路,但实际上第一篇关于指针的内容是不太容易忘记的.这是第二篇中的内容是比较容易混淆,但对于指针的进一步学习也是非常重要的. 一.指向函数的指针 1.函数指针 ·函数指针即指向函数的指针,函数指针值为函数的入口地址,通过使用该指针,即可以使用该函数: ·编写一个程序返回两个数的最大值,通过函数指针调用函数: a.main函数代码如下: #include<stdio.h> int max(int *, int *);

Oracle函数-高阶篇

下面整理了部分oracle函数-高阶篇: 1. CATSTR    举例:SELECT CATSTR(COLUMN_NAME) NAME_LIST FROM DBA_TAB_COLUMNS WHERE TRIM(TABLE_NAME) = 'T_RZ_DKDATA'  --查询出的结果在一个列中2. INSTR() 检索字符串函数:匹配则返回首次检索的位置的索引值(从1开始),值>0,否则返回值=0    举例:SELECT * FROM USER_TABLES WHERE INSTR(TABL

Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 而函数式编程(请注意多了一个"式"字)--Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算. 我们首先要搞明白计算机(Computer)和计算(Compute)的概念. 在计算机的层次上,CPU执行的是加减乘除的指令代码

【进阶 6-1 期】JavaScript 高阶函数浅析

引言   本期开始介绍 JavaScript 中的高阶函数,在 JavaScript 中,函数是一种特殊类型的对象,它们是 Function objects.那什么是高阶函数呢?本节将通过高阶函数的定义来展开介绍. 高阶函数 高阶函数英文叫 Higher-order function,它的定义很简单,就是至少满足下列一个条件的函数: 接受一个或多个函数作为输入 输出一个函数 也就是说高阶函数是对其他函数进行操作的函数,可以将它们作为参数传递,或者是返回它们. 简单来说,高阶函数是一个接收函数作为

python开发之路---第二章之--函数之高阶函数

## 一个函数的变量为另一个函数,这种函数就称为高阶函数 ## return 一个函数名也可以称为高阶函数 def func(x,y): return x+y def cale(x): return x f = cale(func) a = f(4,5) print (a) ## 这里的实际上执行的是func的函数,所以不传参数的话会报错,必须传入2个参数, 原文地址:https://www.cnblogs.com/LoveElsa/p/10280029.html

七. python进阶(内置高阶函数)

一. 内置高阶函数 高阶函数 函数接收的参是一个函数名 返回值包含函数 把函数当作一个参数传给另一个函数 def a(n): print(n) def b(name): print('my name is 哈哈哈') a(b('111111111111111111111111111111111')) # my name is 哈哈哈 # None def a(n): print(n) #<function b at 0x000002EAA7B43E18> def b(): print('my

函数-内置函数,匿名函数,嵌套函数,高阶函数,序列化

函数简单说明 # 函数即"变量" # 高阶函数 # a.把一个函数名当做实参传给另一个函数(在不修改被装饰函数的源代码的情况下,为其添加功能) # b.返回值中包含函数名(不修改函数的调用方式) ''' import time def bar(): print("in the bar!") time.sleep(2) def foo(func): start_time = time.time() func() #根据内存地址,执行代码 stop_time = tim