生成程序崩溃的dump文件,使用windbg调试
来源:互联网 发布:索尼手机升级网络挂起 编辑:程序博客网 时间:2024/06/10 02:42
1,目的
有时候程序在客户那里崩溃了,你程序也没有什么有效的log日志能记录到崩溃的细节,那这实在是一件很麻烦的事情。
你得向客户反复了解操作内容并希望能在自己这里重现,这个过程想想都很痛苦吧。。
使用下面的方法,能在程序崩溃时生成一个自己的dump文件,记录了崩溃时的一些有用的信息,一般能帮你容易地找到出错的地方。
2,原理
简单地说,就是windows程序崩溃时会调一个对话框显示一些没什么用的信息。
XP下:
WIN7中:
①设置崩溃时的回调函数。
有一个方法可以让我们设置程序崩溃时先执行的回调函数,这里面可以弹我们自己的对话框,比如让用户输入一些有用的内容然后发送给我们。
这个函数是SetUnhandledExceptionFilter .
原型:
WINBASEAPILPTOP_LEVEL_EXCEPTION_FILTERWINAPISetUnhandledExceptionFilter( __in_opt LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter );它的参数是你要设置的回调函数:PTOP_LEVEL_EXCEPTION_FILTER
typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)( __in struct _EXCEPTION_POINTERS *ExceptionInfo );typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
系统调起你的回调函数时,会给你传一个代表异常信息的结构:EXCEPTION_POINTERS
typedef struct _EXCEPTION_POINTERS { PEXCEPTION_RECORD ExceptionRecord; PCONTEXT ContextRecord;} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
我们现在要做的就是在回调函数里根据这个系统给我们的信息,记录到一个dump文件中去。供我们使用windbg分析。
通过SetUnhandledExceptionFilter 函数的返回值我们可以选择在回调结束后不再弹原来默认的对话框而直接结束程序、或者再弹那个默认的再结束程序、不弹对话框继续执行。
如下:
#define EXCEPTION_EXECUTE_HANDLER 1 //在回调结束后不再弹原来默认的对话框而直接结束程序#define EXCEPTION_CONTINUE_SEARCH 0//再弹那个默认的再结束程序#define EXCEPTION_CONTINUE_EXECUTION -1//继续执行
②在回调函数中输出崩溃信息到dump文件。
往dump文件写内容用到一个API:MiniDumpWriteDump。
在DbgHelp.h头文件中,且需包含 DbgHelp.lib库。
#include <DbgHelp.h>#pragma comment(lib, "dbghelp.lib")
函数形式:
BOOLWINAPIMiniDumpWriteDump( __in HANDLE hProcess, __in DWORD ProcessId, __in HANDLE hFile, __in MINIDUMP_TYPE DumpType, __in_opt PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, __in_opt PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, __in_opt PMINIDUMP_CALLBACK_INFORMATION CallbackParam );说明:
hProcess ——进程句柄,使用GetCurrentProcess()获得即可。
ProcessID——进程ID,GetCurrentProcessId()。
hFile ——我们创建的dump文件句柄。
DumpType——dump类型,一般填MiniDumpNormal 即可,具体内容参看DbgHelp.h和MSDN。
ExceptionParam—— 1)ThreadId:GetCurrentThreadId()。
2)ExceptionPointers:即回调函数的参数。
3)ClientPointers:一般填TRUE即可。
UserStreamParam—— 一般设NULL。
CallbackParam —— 一般设NULL。
3,演示程序代码
如果是release版,需要在工程配置中设置生成调试文件和生成映射文件。
如图:
win32控制台程序:
#include "stdafx.h"#include <windows.h>#include <DbgHelp.h>#pragma comment(lib, "dbghelp.lib")//我们的回调函数LONG __stdcall ExceptCallBack( EXCEPTION_POINTERS *pExcPointer){MessageBox(NULL,"程序崩溃!相关信息记录在C:\\Test.dmp文件中。",NULL,MB_OK);//创建dump文件HANDLE hFile = CreateFile("C:\\Test.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);//向文件写下当前程序崩溃相关信息MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;loExceptionInfo.ExceptionPointers = pExcPointer;loExceptionInfo.ThreadId = GetCurrentThreadId();loExceptionInfo.ClientPointers = TRUE;MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);CloseHandle(hFile);return EXCEPTION_EXECUTE_HANDLER;}void WrongFun(){//crash int * p = NULL;*p = 1;}int _tmain(int argc, _TCHAR* argv[]){//设置崩溃回调函数SetUnhandledExceptionFilter(ExceptCallBack);WrongFun();return 0;}
4,效果。
crash后先弹出一个对话框:
之后不再调windows自带的崩溃对话框了。程序结束。
5,使用windbg查看dmp文件
用windbg 菜单 File->Open Crash File 打开这个Test.dmp文件,在下方编辑框输入 “!analyze -v” 命令执行自动分析。
稍等一会,就会出现一些内容,大致找到如下:
就能看到程序崩溃的一些细节甚至代码。
- 生成程序崩溃的dump文件,使用windbg调试
- 生成程序崩溃的dump文件,使用windbg调试
- 使用WinDBG生成和调试dump文件
- 使用WinDbg抓取程序报错的Dump文件,例如抓取IE崩溃的Dump
- 使用Windbg生成dump文件
- 使用Windbg生成dump文件
- 使用Windbg生成dump文件
- 让程序崩溃时生成dump文件以供调试
- 程序崩溃 dump 文件 *.kdmp的使用
- 程序崩溃 dump 文件 *.kdmp的使用
- 使用WinDBG生成dump文件 WinDBG分析dump文件
- Vs中使用dump文件调试程序崩溃
- MFC程序自动生成dump Windbg文件
- WINDBG调试DUMP文件
- WinDBG调试Dump文件
- WinDbg调试dump文件
- windbg生成dump文件
- 使用WinDbg抓取程序报错的Dump文件
- 再看《周渔的火车》 转载一篇不错的影评
- SQL SERVER 2012 无法附加数据库,在附加数据库界面显示不了待附加的MDB文件
- VC MFC工具栏(CToolBar)控件
- 设计思想简述
- mathdemo
- 生成程序崩溃的dump文件,使用windbg调试
- MIME协议及源邮件格式分析
- 针对TAB切换的隐藏区域
- C#中Dictionary字典取值
- 消费者购买动机的类型及对购买行为的作用
- ArcGIS For Android 解析WKT [支持多多边形、岛、洞]
- 公钥加密与数据签字
- HDU 3746 Cyclic Nacklace(KMP)
- ubuntu常用命令备忘