天天看点

dump文件的生成及的分析

一、使用程序自动生成dump文件。在程序运行崩溃时,会自动生成到程序运行目录。添加以下。

#include <DbgHelp.h>

#pragma comment(lib, "dbghelp.lib")//注意:动态库dbghelp.dll也要加入到运行目录下。

LONG __stdcall ExceptCallBack(EXCEPTION_POINTERS *pExcPointer)

{

char szFileName[1024] = { 0 };

GetModuleFileName(NULL, szFileName, sizeof(szFileName));

string strFilePath(szFileName);

int pos = strFilePath.find_last_of('\\', strFilePath.length());

string strDir = strFilePath.substr(0, pos + 1);                       // 获取文件夹路径

int suffixPos = strFilePath.find_last_of(".", strFilePath.length());

string strFile = strFilePath.substr(pos + 1, suffixPos - pos - 1);     // 文件名称

string strDmpfile = strDir.append(strFile).append(".dmp");            // 配置文件路径

string erromsg = "程序崩溃!相关信息记录在:" + strDmpfile;

MessageBox(NULL, erromsg.c_str(), NULL, MB_OK);

//创建dump文件

HANDLE hFile = CreateFile(strDmpfile.c_str(), 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;

}

int main(int argc, char* argv[])

{  

//main开始,注册生成dump回调

SetUnhandledExceptionFilter(ExceptCallBack);

        ...

二、然后将对应版本的pdb文件和dump文件放到同一个文件夹内。用windbg.exe 加载“Open crash Dump”.

加载后,输入命令:“.ecxr”  来显示错误上下文

                 “ kb  ”   来显示调用堆栈

即可定位问题行数。

或者用            !analyze -v 来自动分析

继续阅读