【发布时间】:2014-10-20 23:28:10
【问题描述】:
我在我的 Qt 应用程序的 Windows 版本中添加了一个 mini-core-dump 功能(通过 __try/__except 和 MiniDumpWriteDump()),因此如果/当我的应用程序崩溃时,将写入一个 .dmp 文件输出到磁盘供我稍后查看和调试。
这很好用,但为了测试,我希望有一个已知可靠的方法来让我的程序崩溃。例如,GUI 中可能有一个“立即崩溃”按钮,当用户单击它时,它会导致应用程序故意崩溃。
当然,一种方法是这样的:
int * badPointer = NULL;
*badPointer = 666;
这对我有用,但我不喜欢这种方法,因为它依赖于未定义的行为——特别是,C++ 标准不要求上述代码导致崩溃,所以有可能(从语言律师的角度来看)当上述代码执行时,某些未来版本的编译器不会崩溃。
作为一种更“官方”的方法,我尝试了这个:
abort();
...确实会终止程序,但不会导致触发 MiniCrashDump 处理程序的 Windows 结构化异常,因此不会写入 .dmp 文件。
我的问题是,是否有“官方正确的方法”可以让我的程序崩溃?我看到 Windows API 有一个可以调用的 RaiseException() 函数,但我不确定它的正确参数应该是什么。这是要走的路吗,还是有一些更具体的电话我最好使用?
【问题讨论】:
-
锤击屏幕。
-
您正在大量使用特定于实现的关键字和行为,并且您担心某天 C++ 规范可能会说些什么?当然,RaiseException() 是官方的方式。
-
@HansPassant 让我担心的不是 C++ 规范,而是 MSVC 优化器,它可能会开始做 gcc 风格的思维技巧,比如说“因为我知道 badPointer 是 NULL,并且因为取消引用 NULL指针是未定义的行为,我可以优化掉那个写“......然后突然我的崩溃按钮不再崩溃了。 :)
标签: windows crash-reports seh