0

0

c++怎么在程序崩溃时自动生成一个小的dump文件_C++故障诊断与最小Dump生成

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-11-15 00:05:12

|

226人浏览过

|

来源于php中文网

原创

程序崩溃时生成小型dump文件可帮助开发者定位问题。Windows平台通过SetUnhandledExceptionFilter捕获异常,调用MiniDumpWriteDump生成minidump;Linux平台则利用setrlimit限制core dump大小,并配置信号处理。应控制dump体积,保留关键信息如调用栈和寄存器状态,配合日志使用。分析时可用WinDbg或gdb工具,确保符号一致。实现需注意文件路径和权限,建议在发布版本中保留调试信息以便后续分析。

c++怎么在程序崩溃时自动生成一个小的dump文件_c++故障诊断与最小dump生成

程序崩溃时自动生成一个小的dump文件,可以帮助开发者快速定位问题,尤其是在无法现场调试的生产环境中。C++本身不提供内置的崩溃转储机制,但在Windows和Linux平台上,可以通过系统API或外部工具实现最小化dump(minidump)的生成。

Windows平台:使用DbgHelp生成Minidump

在Windows上,最常用的方法是调用MiniDumpWriteDump函数,该函数位于DbgHelp.dll中。你需要链接dbghelp.lib并包含头文件windows.h>

基本步骤如下:

  • 设置一个全局异常处理函数,通过SetUnhandledExceptionFilter捕获未处理的异常。
  • 在异常处理函数中打开一个文件用于保存dump。
  • 调用MiniDumpWriteDump写入进程信息,可以选择只写入关键线程、调用和模块信息以减小文件体积。

示例代码片段:

立即学习C++免费学习笔记(深入)”;

// 异常回调函数
LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo) {
    HANDLE hFile = CreateFile(L"crash.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile != INVALID_HANDLE_VALUE) {
        MINIDUMP_EXCEPTION_INFORMATION mdei;
        mdei.ThreadId = GetCurrentThreadId();
        mdei.ExceptionPointers = ExceptionInfo;
        mdei.ClientPointers = FALSE;
    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
                      hFile, MiniDumpNormal, &mdei, NULL, NULL);
    CloseHandle(hFile);
}
return EXCEPTION_EXECUTE_HANDLER;

}

在main函数开始处注册:

SetUnhandledExceptionFilter(ExceptionHandler);

Linux平台:利用信号和核心转储控制大小

Linux默认会在某些信号(如SIGSEGV)下生成core dump,但通常体积较大。你可以通过setrlimit限制其大小,并结合signalsigaction进行自定义处理。

控制核心转储大小的方法:

CodeSquire
CodeSquire

AI代码编写助手,把你的想法变成代码

下载
  • 调用setrlimit设置RLIMIT_CORE为较小值(如10MB),避免生成过大的文件。
  • 确保系统允许生成core dump:ulimit -c unlimited 或指定大小。
  • 可重定向core文件路径,例如通过echo "/tmp/core.%p" > /proc/sys/kernel/core_pattern"

如果你希望更精细控制,可以在信号处理中调用外部工具(如gdb)提取关键信息,生成轻量级日志,而不是完整core dump。

跨平台建议与最佳实践

为了便于诊断又不占用过多磁盘空间,应追求“最小可用dump”:

  • 只保留崩溃线程的调用栈、寄存器状态和加载模块信息。
  • 避免包含堆内存全部内容,除非必要。
  • 在发布版本中启用符号(PDB或debug info),但可剥离后单独保存,便于后续分析。
  • 配合日志记录,dump文件更有上下文。

Windows推荐使用MiniDumpNormal或MiniDumpWithIndirectlyReferencedMemory级别,平衡大小与信息量。Linux可结合abrtsystemd-coredump做自动化截断和上报。

分析Dump文件

生成dump后,可用以下工具分析:

  • Windows:Visual Studio 或 WinDbg 打开.dmp文件,查看调用栈和变量状态。
  • Linux:使用gdb your_program core进行回溯(bt命令)。

确保二进制文件与编译时一致,否则符号可能错乱。

基本上就这些。只要在程序启动时注册好崩溃捕获逻辑,就能在出错时自动留下线索。关键是控制dump大小,同时保留足够诊断信息。实现起来不复杂,但容易忽略权限或路径问题,记得测试一下是否真能生成文件。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

371

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

563

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

371

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

563

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

472

2023.08.10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

523

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1058

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

751

2023.08.01

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.4万人学习

Git 教程
Git 教程

共21课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号