天天看点

windows环境下定位随机崩溃

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

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