Visual Studio环境下生成dump文件及利用dump文件定位程序出错位置

本文介绍了如何在Visual Studio 2008环境下生成dump文件,并利用dump文件来定位程序出错位置。通过在程序中加入Dump.h文件,设置异常过滤器,调整项目配置,然后编译运行,可以生成dump文件。之后,通过VS2008打开dmp文件,配置符号文件位置,设置调试源文件路径,即可在出错位置进行调试。
部署运行你感兴趣的模型镜像

今天在网上学习了关于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调试,程序会自动在出错位置停下来。

您可能感兴趣的与本文相关的镜像

Anything-LLM

Anything-LLM

AI应用

AnythingLLM是一个全栈应用程序,可以使用商用或开源的LLM/嵌入器/语义向量数据库模型,帮助用户在本地或云端搭建个性化的聊天机器人系统,且无需复杂设置

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值