### 如何在VS2010中配置程序以在崩溃时自动创建DUMP文件 本文档将详细介绍如何在Visual Studio 2010 (VS2010)中配置一个项目,使其能够在程序崩溃时自动生成DUMP文件,并提供一些基本的DUMP文件分析方法。 #### 一、基础知识介绍 在开始之前,我们先了解一些基本概念: - **DUMP文件**:一种用于记录程序崩溃时状态的文件,通常包含线程上下文、内存状态等关键信息。 - **Visual Studio 2010 (VS2010)**:一款由微软开发的集成开发环境(IDE),广泛用于Windows平台的应用开发。 - **DbgHelp库**:提供了用于创建、解析和处理DUMP文件的API,是实现本功能的核心组件之一。 - **Windbg**:微软提供的调试工具,可用于分析DUMP文件,找出导致程序崩溃的原因。 #### 二、准备工作 在开始编写代码之前,请确保已经安装了以下组件: - Visual Studio 2010 - Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 - Debugging Tools for Windows (x86) #### 三、实现步骤 ##### 1. 配置项目 在VS2010中打开或创建一个新的项目,然后进行如下设置: - 打开项目的属性页面(`右击项目名称 -> 属性`)。 - 在配置属性中选择C/C++ -> 常规 -> 添加附加包含目录(`C:\Program Files (x86)\Windows Kits\8.0\Include\ucrt` 和 `C:\Program Files (x86)\Windows Kits\8.0\Include\shared`)。 - 连接器 -> 常规 -> 添加附加库目录(`C:\Program Files (x86)\Windows Kits\8.0\Lib\ucrt\x86` 和 `C:\Program Files (x86)\Windows Kits\8.0\Lib\shared\x86`)。 - 连接器 -> 输入 -> 添加附加依赖项(`dbghelp.lib`)。 ##### 2. 编写代码 接下来,我们需要编写一段代码来实现DUMP文件的自动创建。示例代码如下: ```cpp #include #include #include #pragma comment(lib, "dbghelp.lib") // 判断是否需要保留数据段 inline BOOL IsDataSectionNeeded(const WCHAR *pModuleName) { if (pModuleName == 0) return FALSE; WCHAR szFileName[_MAX_FNAME] = L""; _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL); if (_wcsicmp(szFileName, L"ntdll") == 0) return TRUE; return FALSE; } // DUMP文件回调函数 inline BOOL CALLBACK MiniDumpCallback(PVOID pParam, const PMINIDUMP_CALLBACK_INPUT pInput, PMINIDUMP_CALLBACK_OUTPUT pOutput) { if (pInput == 0 || pOutput == 0) return FALSE; switch (pInput->CallbackType) { case ModuleCallback: if (pOutput->ModuleWriteFlags & ModuleWriteDataSeg) if (!IsDataSectionNeeded(pInput->Module.FullPath)) pOutput->ModuleWriteFlags &= ~(ModuleWriteDataSeg); case IncludeModuleCallback: case IncludeThreadCallback: case ThreadCallback: case ThreadExCallback: return TRUE; default: break; } return FALSE; } // 创建Mini Dump inline void CreateMiniDump(PEXCEPTION_POINTERS pep, LPCTSTR strFileName) { HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) { MINIDUMP_EXCEPTION_INFORMATION mdei; mdei.ThreadId = GetCurrentThreadId(); mdei.ExceptionPointers = pep; mdei.ClientPointers = NULL; MINIDUMP_CALLBACK_INFORMATION mci; mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback; mci.CallbackParam = 0; ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, MiniDumpNormal, (pep != 0) ? &mdei : 0, NULL, &mci); CloseHandle(hFile); } } // 异常过滤器 LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo) { CreateMiniDump(pExceptionInfo, L"core.dmp"); return EXCEPTION_EXECUTE_HANDLER; } // 禁止调用SetUnhandledExceptionFilter void DisableSetUnhandledExceptionFilter() { void* addr = (void*)GetProcAddress(LoadLibrary(L"kernel32.dll"), "SetUnhandledExceptionFilter"); if (addr) { unsigned char code[16]; int size = 0; code[size++] = 0x33; code[size++] = 0xC0; code[size++] = 0xC2; code[size++] = 0x04; code[size++] = 0x00; DWORD oldProtect = 0; // 代码注入逻辑省略... } } ``` 这段代码实现了以下功能: - `IsDataSectionNeeded`: 判断模块名是否为“ntdll”,如果是,则返回`TRUE`,表示该模块的数据段需要被保留。 - `MiniDumpCallback`: 回调函数,用于控制哪些模块的数据段需要被包含在DUMP文件中。 - `CreateMiniDump`: 核心函数,当程序崩溃时会调用该函数创建DUMP文件。 - `MyUnhandledExceptionFilter`: 当未处理异常发生时,系统会调用这个函数来处理异常。这里创建DUMP文件后返回`EXCEPTION_EXECUTE_HANDLER`,以便程序继续执行。 ##### 3. 注册异常处理器 最后一步是在程序启动时注册异常处理器,可以使用以下代码: ```cpp SetUnhandledExceptionFilter(MyUnhandledExceptionFilter); ``` 这行代码需要放在程序的入口函数(如`main()`)中,确保程序在启动时就注册了自定义的异常处理函数。 #### 四、分析DUMP文件 一旦生成了DUMP文件,我们可以使用Windbg来分析它。以下是一些基本命令: - `.loadby sos mscorwks`:加载.NET框架调试支持。 - `!analyze -v`:分析DUMP文件中的异常情况。 - `kb`:显示调用堆栈。 - `lm`:列出所有已加载的模块。 通过这些命令,你可以获取到崩溃时的详细信息,从而定位问题并修复它。 #### 五、总结 通过以上步骤,你可以在Visual Studio 2010中轻松地为项目配置异常处理机制,使其能够在崩溃时自动生成DUMP文件。这些DUMP文件随后可以通过Windbg等工具进行分析,帮助开发者快速定位问题所在。这种方式不仅适用于开发阶段,也可以应用于生产环境,提高应用的稳定性和用户体验。
2025-12-08 09:34:51 15KB vs2010 dump windbg
1
BugTrap定位VS程序崩溃
2022-09-15 16:32:36 2.01MB VS BugTrap
1
如何定位Release程序崩溃原因
2022-03-28 10:36:20 299KB 定位 Release 程序崩溃 原因
1
所谓“崩溃”指的是应用程序报错后对应进程突然消失或者对应服务自动停止。程序出现Bug乃至Crash,均不可怕,可怕是不能找到快速的定位手段。
2022-03-25 21:08:02 498KB 崩溃
1
运行程序代参数,drmingw.exe -a -i,当程序崩溃时会自动弹出崩溃信息,和崩溃位置,非常好用。
2022-03-17 11:58:16 947KB 程序崩溃 崩溃位置 自动检测 c++
1
JIT调试器设置 Hive: HKEY_LOCAL_MACHINE Key: SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug 命令行语法 C:\windbg\windbg.exe –p %ld –e %ld -g WinDBG –I
2022-03-16 15:41:28 1.98MB 软件调试
1
核心处理程序 对于嵌入式 Linux ARM 系统,当程序崩溃时生成带有堆栈回溯的报告。
2022-03-03 16:03:54 30KB C
1
通过进程间通讯实现进程守护,如果崩溃:包括但不限于 数组越界,内存泄露,意外退出,停止运行。守护进程会自动重新打开被守护的程序。 如果同时守护多个程序,只需要打开一个守护者就可以。 超级简单的调用:两个命令,一个开始守护,一个停止守护。 自身崩溃了也可以守护自己(演示程序中有个异常捕获可以参考,加上程序_重启()即可),但是只能在 易语言 自己可以捕获到的异常情况下,如果出现a闪退这种情况程序自身是无法自动重启的,这种情况下就需要一个守护进程。 也可以将守护进程封装到主程序里,守护之前主动启动守护进程,这个可以参考代码中的傻瓜版代码的原理,由于封装的着急,傻瓜版本做的还比较简陋,包括守护者也只是实现了基础功能,还有很多优化空间,大家可以自行发挥补全。
2022-01-22 21:49:53 3.04MB 高级教程源码
1
作者有10多年编程,调试经验,详解关于Windows 平台下程序崩溃的Windbg调试方法及技巧;附带工具介绍 适合于分析C++等语言, .Net 平台等快速入门及提高
2021-11-23 10:29:56 1.32MB .NET WinDbg 程序崩溃 内存泄露
1
win32 捕获程序崩溃的源码 生成dump文件并且弹出MessageBox vs2015编译
2021-10-15 09:02:45 13KB win32程序崩溃排查
1