vs2017下dump文件自动生成及dump文件的调试使用

简介: vs2017下dump文件自动生成及dump文件的调试使用

1、新增文件CCreateDump.h

#pragma once
#include "stdafx.h"
#include <string>
#include <fstream>
using namespace std;
class CCreateDump
{
public:
  CCreateDump();
  ~CCreateDump(void);
  static CCreateDump* Instance();
  static long __stdcall UnhandleExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo);
  void DeclarDumpFile(std::string dmpFileName = "");
private:
  static std::string    strDumpFile;
  static CCreateDump*    __instance;
};

2、CCreateDump.cpp

#include "stdafx.h"
#include <Windows.h>
#include "CCreateDump.h"
#include <DbgHelp.h>
#include <codecvt>
#pragma comment(lib,  "dbghelp.lib")
CCreateDump* CCreateDump::__instance = NULL;
std::string CCreateDump::strDumpFile = "";
CCreateDump::CCreateDump()
{
}
CCreateDump::~CCreateDump(void)
{
}
long  CCreateDump::UnhandleExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo)
{
  std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converterX;
  std::wstring dumpFile = converterX.from_bytes(strDumpFile.c_str());
  HANDLE hFile = CreateFile(dumpFile.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  if (hFile != INVALID_HANDLE_VALUE)
  {
    MINIDUMP_EXCEPTION_INFORMATION   ExInfo;
    ExInfo.ThreadId = ::GetCurrentThreadId();
    ExInfo.ExceptionPointers = ExceptionInfo;
    ExInfo.ClientPointers = FALSE;
    //   write   the   dump
    BOOL   bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);
    CloseHandle(hFile);
    if (!bOK)
    {
      DWORD dw = GetLastError();
      //写dump文件出错处理,异常交给windows处理
      return EXCEPTION_CONTINUE_SEARCH;
    }
    else
    {    //在异常处结束
      return EXCEPTION_EXECUTE_HANDLER;
    }
  }
  else
  {
    return EXCEPTION_CONTINUE_SEARCH;
  }
  return EXCEPTION_EXECUTE_HANDLER;
}
void CCreateDump::DeclarDumpFile(std::string dmpFileName)
{
  SYSTEMTIME syt;
  GetLocalTime(&syt);
  char c[MAX_PATH];
  sprintf_s(c, MAX_PATH, "%04d-%02d-%02d_%02d-%02d-%02d", syt.wYear, syt.wMonth, syt.wDay, syt.wHour, syt.wMinute, syt.wSecond);
  strDumpFile = std::string(c);
  if (!dmpFileName.empty())
  {
    strDumpFile += dmpFileName;
  }
  strDumpFile += std::string(".dmp");
  SetUnhandledExceptionFilter(UnhandleExceptionFilter);
}
CCreateDump* CCreateDump::Instance()
{
  if (__instance == NULL)
  {
    __instance = new CCreateDump;
  }
  return __instance;
}

3、main.cpp

#include <Windows.h>
#include "CCreateDump.h"
int main(void)
{
  std::ofstream ofs("test.txt", std::ios::app);
  ofs << "begin!!!" << std::endl;
  ofs.close();
  std::cout << "11111111111111111" << std::endl;
  std::cout << "11111111111111111" << std::endl;
  std::cout << "11111111111111111" << std::endl;
  std::cout << "11111111111111111" << std::endl;
  std::cout << "11111111111111111" << std::endl;
  CCreateDump::Instance()->DeclarDumpFile("dumpfile");
  int *p = NULL;
  std::cout << "11111111111111111" << std::endl;
  std::cout << "11111111111111111" << std::endl;
  std::cout << "11111111111111111" << std::endl;
  std::cout << "11111111111111111" << std::endl;
  std::cout << "11111111111111111" << std::endl;
  *p = 5;
  std::cout << "11111111111111111" << std::endl;
  std::cout << "11111111111111111" << std::endl;
  std::cout << "11111111111111111" << std::endl;
  std::ofstream ofs1("test.txt", std::ios::app);
  ofs1 << "end!!!" << std::endl;
  ofs1.close();
  return 0;
}

程序崩溃后,在本地exe的目录下会生成类似2020-09-24_14-06-12dumpfile.dmp的文件。

特别说明:当时直接在vs上进行运行时,不管是release还是debug模式,一运行后会直接崩溃,也不会进入异常捕获的函数,当时还以为是需要配置vs,或者是windows缺少某些系统库导致的。后来经大神提点后发现是vs调试器已经捕获导致的。直接点击exe文件运行后,生成了dump文件,完美实现生成dump。

vs使用dump文件调试方法:

1、将pdb文件、exe文件放到同一目录下

2、设置符号链接地址(pdb文件的路径):

3、附加源码路径:

项目解决方案-属性-调试源文件

4、点击“使用仅本机进行调试”

完成崩溃代码的定位。

注意:如果崩溃的断点注重定位到windows库的某个文件后停止了,需要下载windows库的pdb符号文件,然后再设置符号路径,将windows库的pbd文件路径加入。

windows pdb下载地址

参考博客:

https://www.cnblogs.com/swarmbees/p/5621602.html

https://blog.csdn.net/u012372584/article/details/87965913?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

https://www.jianshu.com/p/3c5c6d571a29

相关文章
|
IDE 开发工具 C语言
Visual Studio 2017 安装及使用(新手)
Visual Studio 2017 安装及使用(新手)
2196 0
Visual Studio 快速分析 .NET Dump 文件
【11月更文挑战第10天】.NET Dump 文件是在 .NET 应用程序崩溃或出现问题时生成的,记录了应用程序的状态,包括内存对象、线程栈和模块信息。通过分析这些文件,开发人员可以定位和解决内存泄漏、死锁等问题。在 Visual Studio 中,可以通过调试工具、内存分析工具和符号加载等功能来详细分析 Dump 文件。此外,还可以使用第三方工具如 WinDbg 进行更深入的分析。
921 1
|
安全 C++ 开发者
C++ 11新特性之shared_ptr
C++ 11新特性之shared_ptr
484 0
|
存储 监控 C++
vs下dump文件的生成
vs下dump文件的生成
645 0
|
算法 API 图形学
【Qt 学习笔记】QWidget的geometry属性及window frame的影响
【Qt 学习笔记】QWidget的geometry属性及window frame的影响
1133 2
Qt三方库开发技术:QXlsx介绍、编译和使用
Qt三方库开发技术:QXlsx介绍、编译和使用
Qt三方库开发技术:QXlsx介绍、编译和使用
|
Windows 计算机视觉 Linux
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
该文档介绍了Qt的跨平台特性,并推荐在Windows和Linux开发中使用QtCreator。在Windows下添加动态库,可以通过Visual Studio配置.lib文件和.dll文件,或在QtCreator中使用&quot;添加库&quot;功能。在QtCreator中,选择库文件、包含路径,并配置Details,然后更新.pro文件,清除、qmake及构建项目。运行时确保.dll与.exe在同一目录下。
720 0
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
【Qt 学习笔记】Qt常用控件 | 显示类控件 | Progress Bar的使用及说明
【Qt 学习笔记】Qt常用控件 | 显示类控件 | Progress Bar的使用及说明
2728 0
|
存储
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
1694 0
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
|
安全 程序员 编译器
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误(一)
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误
1183 1