windows - 故意使我的 Windows 应用程序崩溃的最佳方法是什么?

标签 windows crash-reports seh

我已经在我的 Qt 应用程序的 Windows 构建中添加了一个迷你核心转储功能(通过 __try/__except 和 MiniDumpWriteDump()),这样如果/当我的应用程序崩溃时,将写入一个 .dmp 文件输出到磁盘供我稍后查看和调试。

效果很好,但为了测试,我希望有一个已知可靠的方法来使我的程序崩溃。例如,GUI 中可能有一个“立即崩溃”按钮,当用户单击它时,它会导致应用程序故意崩溃。

当然,一种方法是这样的:

int * badPointer = NULL;
*badPointer = 666;

这对我有用,但我不喜欢这种方法,因为它依赖于未定义的行为——特别是,C++ 标准不要求上述代码导致崩溃,因此(从语言律师的角度来看)当上述代码执行时,某些 future 版本的编译器可能不会崩溃。

作为一种更“官方”的方法,我试过这个:

abort();

...这确实会终止程序,但不会导致触发 MiniCrashDump 处理程序的 Windows 结构化异常,因此不会写入任何 .dmp 文件。

我的问题是,是否有“官方正确方法”让我的程序崩溃?我看到 Windows API 有一个我可以调用的 RaiseException() 函数,但我不确定它的正确参数应该是什么。这是要走的路,还是有一些更具体的电话我最好使用?

最佳答案

如果您知道自己在 Windows 上运行,取消引用空指针以导致访问冲突是完全没问题的——Windows 提供了比 C++ 语言更强大的保证。 C++ 表示取消引用空指针是未定义行为,但 Windows 将此定义为访问冲突(就 C++ 而言,这是完全可以接受的,因为访问冲突是未定义行为的一种可能结果)。

来自 Managing Virtual Memory :

Windows NT builds a safeguard into every process's address space. Both the upper and lower 65,536 bytes of each process are permanently reserved by the system. These portions of the address space are reserved to trap stray pointers—pointers that attempt to address memory in the range 0000000016-0000FFFF16 or 7FFF000016-7FFFFFFF16. Not coincidentally, it is easy to detect pointers in this range by simply ignoring the lower four nibbles (the rightmost two bytes) in these addresses. Essentially, a pointer is invalid if the upper four nibbles are 000016 or 7FFF16; all other values represent valid addresses.

内存的第一页始终映射为 PAGE_NOACCESS,因此如果您尝试读取或写入空指针(或空指针 +/-64 KB 范围内的任何指针),您'将始终引发访问冲突异常。

关于windows - 故意使我的 Windows 应用程序崩溃的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26476586/

相关文章:

PHP MySQL,PHP无法识别MySQL模块已安装

windows - 在 Windows 上使用 UTF-8 编码的 TCL 文件

ios - sqlite3_exec 在产品配置中崩溃,但在调试中运行良好

crash - 新安装的Xcode 5.1无法安装所有组件,然后在启动时崩溃

c++ - 如何防止编译器优化对从未使用过的变量的加载

windows - Windows 上的 SEH,调用堆栈回溯消失了

c# - 如何处理 Windows 应用程序中的 SecondaryTile 单击事件

windows - 如何检查生成的dll是静态链接还是动态链接?

ios - WebTryThreadLock 线程崩溃 0xbbadbeef

windows - 基于表的异常处理与 32 位 Windows SEH 相比有何优势?