ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

最小整数除零 Dump 实验详解

最小整数除零 Dump 实验详解 1. 实验目标这个工程只验证一条最短的 Windows 崩溃捕获链路:注册顶层异常处理器 - CPU 执行整数除零指令 - Windows 产生 0xC0000094 异常 - 异常处理器收到 EXCEPTION_POINTERS - MiniDumpWriteDump 写入 divide_by_zero.dmp - 进程终止 ``` 工程没有命令行参数、配置类、公共 Dump 库或运行脚本,核心只有: ```text main.cpp CMakeLists.txt它适合先理解最基本原理,再阅读完整DumpCore工程。2. 工程位置源码:Crash_Reporter/Minimal_Divide_By_Zero/ ├── CMakeLists.txt ├── main.cpp └── README.md生成的 Visual Studio 2022 工程:02_Debugging_and_Crash/b-div0/MinimalDivideByZeroDump.slnDebug 产物:b-div0/Debug/MinimalDivideByZeroDump.exe b-div0/Debug/MinimalDivideByZeroDump.pdbb-div0使用短目录名,是为了规避旧版 MSBuild 的 260 字符路径限制。它是可删除、可重新生成的构建目录,不是源码目录。3. CMake 配置3.1 声明 CMake 版本和工程cmake_minimum_required(VERSION 3.20) project(MinimalDivideByZeroDump LANGUAGES CXX)作用:要求 CMake 版本至少为 3.20。创建一个仅使用 C++ 的独立工程。Visual Studio 解决方案名称来自project。3.2 创建可执行程序add_executable(MinimalDivideByZeroDump main.cpp)它把唯一的源文件main.cpp编译为:MinimalDivideByZeroDump.exe3.3 链接 DbgHelptarget_link_libraries(MinimalDivideByZeroDump PRIVATE Dbghelp)MiniDumpWriteDump的声明来自DbgHelp.h,运行时代码由 Windows 的DbgHelp.dll/DbgCore.dll提供。编译阶段还需要链接DbgHelp.lib导入库,否则链接器会报告找不到MiniDumpWriteDump。PRIVATE表示该依赖只属于当前可执行程序,不向其他目标传播。3.4 MSVC 编译选项target_compile_options( MinimalDivideByZeroDump PRIVATE /W4 /permissive- /utf-8) ``` - `/W4`:启用较严格的编译警告。 - - `/permissive-`:要求更严格地遵守 C++ 标准。 - - `/utf-8`:源码和执行字符集使用 UTF-8。 ### 3.5 设置启动项目 ```cmake set_property( DIRECTORY PROPERTY VS_STARTUP_PROJECT MinimalDivideByZeroDump) ``` 打开 `.sln` 后,Visual Studio 默认启动这个程序,而不是 CMake 自动生成的 `ALL_BUILD` 目标。 ## 4. 头文件 ```cpp #include Windows.h #include DbgHelp.h #include cstdio各自作用:头文件提供内容Windows.hSEH、文件句柄、进程和线程 APIDbgHelp.hMiniDumpWriteDump、Minidump 数据结构cstdioputs、fprintf、fflush5. 顶层异常处理函数函数签名:LONG WINAPIWriteDump(EXCEPTION_POINTERS*exception_pointers)5.1LONG返回值告诉 Windows 如何处理该异常。本实验最终返回:EXCEPTION_EXECUTE_HANDLER含义是异常已经交给处理器处理,随后结束故障进程。5.2WINAPIWINAPI指定 Windows API 调用约定。它保证调用方和被调用方对参数传递、栈清理方式的理解一致。5.3EXCEPTION_POINTERSWindows 在异常发生时传入:structEXCEPTION_POINTERS{EXCEPTION_RECORD*ExceptionRecord;CONTEXT
返回列表