windows环境下定位随机崩溃

来源:互联网 发布:qq mac版怎么更新 编辑:程序博客网 时间:2024/04/29 10:52

转自:http://blog.csdn.net/xiezhenghai/article/details/7186414

定位崩溃所需要的文件支持

*.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