今天在网上学习了关于dump文件生成及利用dump文件定位程序出错位置的一些知识,并在VS2008环境下做了简单的试验,现整理记录下来。
一、dump文件的生成
1、在主程序中加入Dump.h文件,这个文件用来实现程序崩溃回调并生成dump文件。代码如下:
//Dump.h
#pragma once
#include <Windows.h>
#include <dbghelp.h>
#define DUMP_FILE ".\\WindowsP.dmp"
#include <string>
using std::string;
void CreateDumpFile(LPCSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
// 创建Dump文件
HANDLE hDumpFile = CreateFileA(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)
// Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// 写入Dump文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
// 这里弹出一个错误对话框并退出程序
char szPath[512];
GetModuleFileNameA(NULL,szPath,512);
char *pChar = strrchr( szPath, '\\');
*(pChar+1) = 0;
string strPath = szPath;
SYSTEMTIME syst;
GetLocalTime(&syst);
char strCount[100];
sprintf_s(strCount,100,"%d.%.2d.%.2d.%.2d.%.2d.%.2d.%.3d.dmp",syst.wYear- 2000,syst.wMonth,syst.wDay,syst.wHour,syst.wMinute,syst.wSecond,syst.wMilliseconds);
strPath +=string(strCount);
MakeSureDirectoryPathExists(strPath.c_str());
CreateDumpFile(strPath.c_str(), pException);
FatalAppExitA(0, "*** Unhandled Exception! ***");
return EXCEPTION_EXECUTE_HANDLER;
}
2、主程序如下:
#include "stdafx.h"
#include "Dump.h"
void TestDump(int* p)
{
for(int i = 0; i < 100; i++)
{
p[i] = i * i;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
TestDump(0);
return 0;
}
3、项目配置
配置Release,在项目——属性——[C/C++]——[常规]——[调试信息格式],设置成“程序数据库(/Zi)”;在[链接器]——[调试]——[生成调试信息],设置成“是(/DEBUG)”,在[生成程序数据库文件]设置生成的pdb文件的路径和文件名;在[链接器]——[输入]——[附加依赖项],添加dbghelp.lib。
4、编译链接主程序,在程序Release目录下会生成pdb文件和exe文件,这两个是运行dump文件的必要文件。运行主程序,会弹出一个对话框,提示“Unhandled Exception!”,点击后程序退出,这时候在Release目录下会发现生成了一个.dmp文件。
二、利用dump文件定位程序出错位置
1、用VS2008打开上面生成的dmp文件,在工具——选项——[调试]——[符号],设置符号文件的位置,包括微软基础库的pdb和上述主程序的pdb文件。在[符号文件(.pdb)的位置]中加入http://msdl.microsoft.com/download/symbols,在[将符号从符号服务器缓存到此目录]设置保存路径,VS会自动下载微软基础库的pdb文件到这个路径下,以后就用再下载了。主程序的pdb文件最好跟exe文件、dmp文件在同一目录下,否则在[符号文件(.pdb)的位置]中加入pdb文件路径。
2、右击解决方案,在[通用属性]——[调试源文件],设置主程序的sln文件路径。
3、按F5调试,程序会自动在出错位置停下来。
本文介绍了如何在Visual Studio 2008环境下生成dump文件,并利用dump文件来定位程序出错位置。通过在程序中加入Dump.h文件,设置异常过滤器,调整项目配置,然后编译运行,可以生成dump文件。之后,通过VS2008打开dmp文件,配置符号文件位置,设置调试源文件路径,即可在出错位置进行调试。
694

被折叠的 条评论
为什么被折叠?



