windows 下C++生成Dump调试文件与分析

简介: windows 下C++生成Dump调试文件与分析

1、前言

dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草。

2、依赖库下载

生成dump需要有Dbghelp的库,正常来说VS、qt都自带了。如果没有,私信我发你。

3、项目配置

3.1、设置输出路径

步骤:右击项目-》属性-》配置属性-》常规 -》输出路径

设置一个固定的输出路径,是为了方便存放deghelp.dll动态库。

3.2、拷贝依赖资源

1、将头文件拷贝至和main.cpp同级。

2、将dbghelp.lib静态库dbghelp.dll动态库拷贝至输出目录下(如果没有输出目录,请先运行一遍程序即可)

3.3 将dbghelp.h添加在工程中

步骤:右击头文件目录-》点击添加-》现有项


3.4、配置lib文件路径

步骤:右击项目-》属性-》配置属性-》链接器 -》输入-》附加依赖项 输入dbghelp.lib


3.5、添加生成minidump文件方法

在main.cpp中添加MyUnhandledExceptionFilter方法。然后在main函数的开头添加SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);代码。

#include <windows.h>
#include <Dbghelp.h>
LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
    HANDLE lhDumpFile = CreateFile(L".\\bin_D\\miniDumpFile.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
    loExceptionInfo.ExceptionPointers = ExceptionInfo;
    loExceptionInfo.ThreadId = GetCurrentThreadId();
    loExceptionInfo.ClientPointers = TRUE;
    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
    CloseHandle(lhDumpFile);
    return EXCEPTION_EXECUTE_HANDLER;
}
int main()
{
    SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    //....
  return 0;
}


4、测试效果

在main中添加下面的代码,然后运行,将会在工作路径下看到miniDumpFile.dmp文件

int test(int a, int b)
{
    return a / b;
}
int main()
{
    SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    int a = 1;
    int b = 0;
    std::cout << test(a, b) << std::endl;
    //....
  return 0;
}


见下图。

5、打开dump文件进行定位

有VS的情况下,可以直接双击xx.dmp文件。然后点击右侧的【仅限本机调试】

然后我们就可以看到程序崩溃的位置,这时我们还可以查看堆栈、内存的信息。加快排查错误。

目录
相关文章
|
5天前
|
Python Windows
在 Windows 平台下打包 Python 多进程代码为 exe 文件的问题及解决方案
在使用 Python 进行多进程编程时,在 Windows 平台下可能会出现将代码打包为 exe 文件后无法正常运行的问题。这个问题主要是由于在 Windows 下创建新的进程需要复制父进程的内存空间,而 Python 多进程机制需要先完成父进程的初始化阶段后才能启动子进程,所以在这个过程中可能会出现错误。此外,由于没有显式导入 Python 解释器,也会导致 Python 解释器无法正常工作。为了解决这个问题,我们可以使用函数。
13 5
|
7天前
|
网络安全 C++ Windows
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
|
18天前
|
编译器 C语言 C++
C++中.h和.hpp文件有什么区别?
C++中.h和.hpp文件有什么区别?
|
18天前
|
Linux C++
Linux C/C++目录和文件的更多操作
Linux C/C++目录和文件的更多操作
|
18天前
|
NoSQL Linux C++
Linux C/C++ gdb调试core文件
Linux C/C++ gdb调试core文件
|
1月前
|
Java C++ Python
C++ 使用getline()从文件中读取一行字符串
`getline()` 是 C++ 中 `istream` 类的一个方法,被 `fstream` 和 `ifstream` 继承,用于从文件中读取一行字符串。它有两种语法:一种是从文件读取 `bufSize-1` 个字符到 `buf` 直到 `\n`,另一种是读到指定分隔符 `delim`。如果文件中的字符数量超过 `bufSize`,会导致读取失败。示例代码展示了如何使用 `getline()` 读取和打印文件内容。通过循环调用 `getline()`,可以连续读取文件的多行数据。
29 0
|
1月前
|
存储 C++ iOS开发
C++ 文件和流
C++ 文件和流
24 0
|
1月前
|
C++
C++程序对数据文件的操作与文件流
C++程序对数据文件的操作与文件流
28 0
|
13天前
|
编解码 安全 网络安全
RealVNC的 VNC server在windows7系统下无法正确运行
在Windows 7上运行旧版VNC Server(如4.1.2)可能存在兼容性问题,但可通过调整配置解决。步骤包括:安装VNC Server,设置兼容性模式(选择Windows XP SP3),启动VNC Server,配置VNC连接参数。若遇到问题,检查防火墙设置,确保系统更新,并考虑升级到新版VNC Server以提高性能和兼容性。
|
26天前
|
开发框架 .NET API
在Windows Server 2008 R2上运行.Net 8应用
在Windows Server 2008 R2上成功运行.Net 8程序,需安装三个补丁:Windows Server 2008 R2 SP1 (KB976932)是基础更新;VC_redist.x64提供MSVC库支持;KB3063858解决.NET运行时加载`kernel.dll`的路径问题。KB3063858可能需要KB2533623。详细信息和下载链接在文中给出。