如何通过SEH机制高效捕捉Windows系统崩溃?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1083个文字,预计阅读时间需要5分钟。
Windows下的C++程序崩溃(如访问空指针、除零、栈溢出等)默认会触发未处理的异常,直接弹出系统错误对话框或静默终止。要完全捕获这类底层/系统级异常,必须使用Windows原生异常处理(SEH),而不是C++异常机制。
为什么 try/catch 捕不到访问违规?
C++ 的 try/catch 只处理 C++ 标准异常(throw 抛出的对象)和部分编译器扩展异常(如 MSVC 的 /EHsc 下的 Win32 SEH 转发,但默认不开启且不可靠)。而 0xC0000005(ACCESS_VIOLATION)、0xC0000094(INTEGER_DIVIDE_BY_ZERO)等属于操作系统内核抛出的结构化异常,绕过 C++ 异常栈 unwind 流程。
本文共计1083个文字,预计阅读时间需要5分钟。
Windows下的C++程序崩溃(如访问空指针、除零、栈溢出等)默认会触发未处理的异常,直接弹出系统错误对话框或静默终止。要完全捕获这类底层/系统级异常,必须使用Windows原生异常处理(SEH),而不是C++异常机制。
为什么 try/catch 捕不到访问违规?
C++ 的 try/catch 只处理 C++ 标准异常(throw 抛出的对象)和部分编译器扩展异常(如 MSVC 的 /EHsc 下的 Win32 SEH 转发,但默认不开启且不可靠)。而 0xC0000005(ACCESS_VIOLATION)、0xC0000094(INTEGER_DIVIDE_BY_ZERO)等属于操作系统内核抛出的结构化异常,绕过 C++ 异常栈 unwind 流程。

