windows环境下定位随机崩溃

本文介绍了在Windows环境中定位应用程序崩溃的方法,包括需要的pdb和dmp文件生成,以及使用windbg进行调试的步骤。通过设置未处理异常过滤器,自动生成dmp文件,并提供了一个minidmp.h的实现示例,便于分析崩溃原因。
 

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值