定位崩溃所需要的文件支持
*.pdb(应用程序调试数据库)
*.dmp(崩溃存储文件)
*.exe / *.dll(应用程序文件)
pdb文件的生成
设置:项目>属性>链接器>调试>生成程序数据库文件
Debug模式下生成PDB文件路径:
1.$(your projects)/运行/debug/client/pdbs/$(ProjectName).pdb
2.$(your projects)/运行/debug/server/pdbs/$(ProjectName).pdb
Release模式下生成PDB文件路径:
1.$(your projects)/运行/release/client/pdbs/$(ProjectName).pdb
2.$(your projects)/运行/release/server/pdbs/$(ProjectName).pdb
dmp文件的生成
1. 包含minidmp.h头文件
2. 在应用程序入口调用:SetUnhandledExceptionFilter(MRUnHandledExceptionFilter);
3. 应用程序运行时自动生成,存放在:/运行/release(debug)/client/dmps/ 目录
定位崩溃点
调试工具windbg或者vc/vs,下面介绍windbg使用
调试步骤:
1. File>Symbol file path>设置*.pdb文件的路径
2. File>Image file path>设置可执行文件的路径
3. File>Source file path>设置源代码路径($(your projects))
4. File>Open Crash Dump>打开崩溃文件*.dmp
5. 输入命令 .ecxr
建议
针对以上调试需要,在每发布一个版本进行测试之前,都要保存对应的PDB文件,而且这个版本的代码要在SVN上打标签,以备程序放出去以后源代码还受跟踪。
下面是minidmp.h文件的实现
#ifndef __MINIDMP_H__
#define __MINIDMP_H__
#include <windows.h>
#include <imagehlp.h>
#include <stdlib.h>
#include <time.h>
#pragma comment(lib, "dbghelp.lib")
inline void CreateMiniDump(EXCEPTION_POINTERS* pep, HANDLE hFile)
{
if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
{
if (pep == NULL)
{
::MessageBoxA(0, "continue to exception", "NOTE", MB_OK);
__try
{
RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);
}
__except(CreateMiniDump(GetExceptionInformation(), hFile), EXCEPTION_CONTINUE_EXECUTION)
{
}
}
else
{
MINIDUMP_EXCEPTION_INFORMATION mdei;
mdei.ThreadId = GetCurrentThreadId();
mdei.ExceptionPointers = pep;
mdei.ClientPointers = FALSE;
MiniDumpWriteDump(GetCurrentProcess(),
GetCurrentProcessId(),
hFile,
MiniDumpNormal,
pep ? &mdei : NULL,
NULL, NULL);
}
CloseHandle(hFile);
}
}
LONG WINAPI MRUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
CreateDirectoryA("dmps", NULL);
char lpFile[255] = {0x00};
time_t t = time(0);
strftime(lpFile, sizeof(lpFile), "dmps\\%Y-%m-%d %H-%M-%S.dmp",localtime(&t));
HANDLE hFile = CreateFileA(lpFile,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
CreateMiniDump(pExceptionInfo, hFile);
return EXCEPTION_EXECUTE_HANDLER; // 程序停止运行
}
#endif