以前主要做Java开发,最近接手公司老项目做升级维护,开发工具是VC6,用了ACE和WxWidgets,当调试功能时,发现程序会出现内存访问异常,所以决定通过生成Dump文件进行分析,通过学习《让程序在崩溃时体面的退出之Dump文件》了解。
我下载了windbg6.11.0001.402版本,在VC项目中compile的include路径增加windbg目录下sdk\inc目录,link的library path增加windbg目录下sdk\lib\(对应的系统)目录,连接库增加dbghelp.lib定义或在程序中写#pragma comment(lib,"dbghelp.lib")。
在程序的主函数文件中增加如下代码:
#include <dbghelp.h>
void createDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
// 创建Dump文件
//
HANDLE hDumpFile = CreateFile((const char*)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)
{
createDumpFile((unsigned short*)(_T("e:\\testaced.dmp")), pException);
return EXCEPTION_EXECUTE_HANDLER;
}
通过在主main函数中写如下代码,会在程序崩溃时产生dump文件
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)applicationCrashHandler);