首页
社区
课程
招聘
[原创]让程序崩溃时自动创建minidump
发表于: 2010-2-1 21:50 24662

[原创]让程序崩溃时自动创建minidump

2010-2-1 21:50
24662

创建Minidump实际上相当的简单。主要是调用了dbghelp.dll提供的API——MiniDumpWriteDump。

函数原型是:
BOOL MiniDumpWriteDump (
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam
); 

前两个参数分别是当前程序的句柄和ID,分别用GetCurrentProcess(), GetCurrentProcessId(),这两个函数就可以获得了。第三个参数是文件句柄,一般我们用CreateFile来创建一个XXX.dmp的文件,而返回的句柄就是我们所需要的。DumpType是Minidump的类型,一般来说设置为MiniDumpNormal就可以了。接下来就是最关键的一个参数ExceptionParam,这是一个指向MINIDUMP_EXCEPTION_INFORMATION 结构的指针。如果不填充这个结构那么我们的minidump就不能达到理想的效果,我会在后面谈到怎么填充这个结构。最后两个参数我认为在这里没有多大用处,我们可以简单的赋值为NULL。

接下来的问题就是,我们怎么在程序崩溃的时候自动的创建Minidump。这里我们就要用到一个Kernel32.dll提供的API——SetUnhandledExceptionFilter 。如果读过《软件调试》等书籍的朋友肯定知道,这个函数是用来设置最后的异常处理函数的。也就是当程序产生异常的时候,如果程序自身没有处理就会调用这个函数设置的异常处理函数来处理这个异常。

有了这个函数的帮助,我们就可以在程序开始的时候设置最后的异常处理函数。并在这个函数中调用MiniDumpWriteDump 。这样就可以达到理想的效果。

不过我还是觉得这个不够方便,因为我每次创建一个程序,都需要调用这个函数。能不能有一个更好的方法呢?的确是有的,我们可以写一个创建minidump的类,然后在类的构造函数中调用SetUnhandledExceptionFilter 来设置异常处理函数。最后的效果就是只需要我们加入事先写好的.h和.cpp文件,然后什么也不用做,直接编译运行就能达到理想的效果了。

再来看看我们所生成的Minidump的效果,将生产的dmp文件拖入windbg,然后!analyze -v,可以看到以下信息:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 8
支持
分享
最新回复 (18)
雪    币: 300
活跃值: (179)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
虽然没有测试,但既然下载了就顶~!
2010-2-3 15:15
0
雪    币: 203
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错,很有价值

方便了我们程序员的调试工作

不过...MFC类库不是也有Dump操作么。唔,不用MFC库的话,是很有用的
2010-2-5 09:08
0
雪    币: 225
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错,方便调试
2010-2-5 11:03
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
以前我一个程序偶尔会崩溃但找不到原因,又不好重现,用这个看看有没有帮助。。
2010-2-5 12:08
0
雪    币: 8192
活跃值: (3861)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
这个太谢谢了 找BUG方便了很多
2010-2-14 12:29
0
雪    币: 708
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习,感谢分享
2010-2-14 12:35
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
一直未接触过dump,今入门

其他语言的怎么利用呢
2010-2-14 13:07
0
雪    币: 224
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
错误报告 包括dump
推荐下 BugTrap
http://bleepsoft.com/bugtrap/
http://www.codeproject.com/KB/applications/BugTrap.aspx

另外svn源码里的crashrpt1.0也不错,目前在google code上有2.0版本
2010-2-15 00:52
0
雪    币: 1407
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
支持楼主
收藏下ls提供的链接
2010-2-15 13:24
0
雪    币: 507
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不错  对BUG定位很有帮助。
2010-2-23 15:55
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这东西在Delphi如何使用?
2010-3-24 01:42
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
13
下载了,多谢LZ
2010-3-25 10:17
0
雪    币: 185
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
下载就要支持下。
2010-12-17 00:21
0
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
也能用
2010-12-17 08:43
0
雪    币: 239
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
很好用呀!
2010-12-17 08:50
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
挺不错的
2011-4-15 01:44
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
不错嘛…太有用了!
2011-4-15 08:00
0
雪    币: 68
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
不错 顶 前几天 搞了半天SetUnHandleExceptionFilter这个函数
2011-4-15 11:16
0
游客
登录 | 注册 方可回帖
返回
//