5

我在我的 Qt 应用程序的 Windows 版本中添加了一个 mini-core-dump 功能(通过 __try/__except 和 MiniDumpWriteDump()),因此如果/当我的应用程序崩溃时,一个 .dmp 文件将被写入磁盘供我稍后查看和调试。

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

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

int * badPointer = NULL;
*badPointer = 666;

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

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

abort();

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

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

4

1 回答 1

3

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

管理虚拟内存

Windows NT 在每个进程的地址空间中建立了一个保护措施。每个进程的高低 65,536 字节均由系统永久保留。地址空间的这些部分被保留用于捕获杂散指针——试图寻址范围为 00000000 16 -0000FFFF 16或 7FFF0000 16 -7FFFFFFF 16的内存的指针。并非巧合的是,只需忽略这些地址中的低四个半字节(最右边的两个字节),就很容易检测到该范围内的指针。本质上,如果高四位是 0000 16或 7FFF 16 ,则指针无效;所有其他值表示有效地址。

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

于 2014-10-21T00:06:53.890 回答