我已经在我的Qt应用程序的Windows版本中添加了一个迷你核心转储功能(通过__try / __ except和MiniDumpWriteDump()),这样如果/当我的应用程序崩溃时,.dmp文件将写入磁盘供我查看并稍后调试。
这非常有效,但是对于测试,我希望有一个已知可靠的方法来使我的程序崩溃。例如,现在可能会出现'#34;崩溃" GUI中的按钮,当用户点击它时,它将导致应用程序故意崩溃。
当然,一种方法就是这样:
int * badPointer = NULL;
*badPointer = 666;
这对我有用,但我不喜欢这种方法,因为它依赖于未定义的行为 - 特别是,C ++标准并没有要求以上代码导致崩溃,因此(从语言 - 律师的角度来看),当上述代码执行时,编译器的某些未来版本不会崩溃。
作为更多"官员"方法,我试过这个:
abort();
...它会终止程序,但它不会导致触发MiniCrashDump处理程序的Windows结构化异常,因此不会写入.dmp文件。
我的问题是,是否有正式的正式方式"崩溃我的程序?我看到Windows API有一个我可以调用的RaiseException()函数,但是我不确定它的正确参数应该是什么。这是要走的路,还是有一些更具体的电话,我会更好用?
答案 0 :(得分:3)
如果您知道自己在Windows上运行,则取消引用空指针以引发访问冲突是完全正常的 - Windows提供比C ++语言更强大的保证。 C ++说取消引用空指针是Undefined Behavior,但Windows将其定义为访问冲突(就C ++而言,这是完全可以接受的,因为访问冲突是未定义行为的一种可能结果)。
Windows NT为每个进程的地址空间构建了一个安全措施。每个进程的上部和下部65,536字节都由系统永久保留。地址空间的这些部分被保留用于捕获杂散指针 - 指针,这些指针试图寻址00000000 16 -0000FFFF 16 或7FFF0000 16 -7FFFFFFF <子> 16 子>。不巧的是,通过简单地忽略这些地址中的低四个半字节(最右边的两个字节),很容易检测到这个范围内的指针。基本上,如果上面的四个半字节是0000 16 或7FFF 16 ,则指针无效;所有其他值代表有效地址。
内存的第一页始终映射为PAGE_NOACCESS
,因此如果您尝试读取或写入空指针(或空指针的+/- 64 KB范围内的任何指针),您将始终引发访问冲突异常。