我已经在我的Qt应用程序的
Windows版本中添加了一个迷你核心转储功能(通过__try / __ except和MiniDumpWriteDump()),这样如果/当我的应用程序崩溃时,.dmp文件将被写入磁盘让我以后查看和调试.
这非常有效,但是对于测试,我希望有一个已知可靠的方法来使我的程序崩溃.例如,GUI中可能存在“立即崩溃”按钮,当用户单击它时,它将导致应用程序故意崩溃.
当然,一种方法是这样的:
int * badPointer = NULL; *badPointer = 666;
这对我有用,但我不喜欢这种方法,因为它依赖于未定义的行为 – 特别是,C标准不要求上面的代码导致崩溃,所以它是可能的(从语言 – 律师的角度来看) )当上面的代码执行时,编译器的某些未来版本不会崩溃.
作为一种更“官方”的方法,我试过这个:
abort();
…它会终止程序,但它不会导致Windows结构化异常触发MiniCrashDump处理程序,因此不会写入.dmp文件.
我的问题是,是否有一个“官方正确的方式”来破坏我的计划?我看到Windows API有一个我可以调用的RaiseException()函数,但我不确定它应该是什么正确的参数.这是要走的路,还是有一些更具体的电话,我会更好用?
如果您知道自己在Windows上运行,则取消引用空指针以引发访问冲突是完全正常的 – Windows提供比C语言更强的保证. C表示取消引用空指针是Undefined Behavior,但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内的任何指针),您将始终引发访问冲突异常.