【问题标题】:I want to crash my mfc application我想使我的 mfc 应用程序崩溃
【发布时间】:2014-04-23 03:48:43
【问题描述】:

当我执行这个...

void CcrashDlg::OnBnClickedBtnCrash()
{
    char* ptr = NULL;
    *ptr = 1;
}

应用程序只是记录“访问冲突”,没有发生任何事情。

如何使我的 MFC 应用程序崩溃? (视觉工作室 2010)

【问题讨论】:

  • 您有任何异常处理程序吗?我不确定,但也许 MFC 在某些情况下会愚蠢地吞下异常(例如单击此按钮)。
  • 使用发布版本尝试您的代码。
  • @JonathonReinhart 只是默认使用我的 onbnclickedbtncrash() 生成的代码。
  • @jussij 版本与调试相同
  • This 你可能会感兴趣。

标签: visual-c++ mfc


【解决方案1】:

我相信答案隐藏在问题的 cmets 中,所以我将在这里总结一下 - 这是重要的东西。

完整的细节在这个链接:The case of the disappearing OnLoad exception – user-mode callback exceptions in x64

您预计会导致程序崩溃的无效操作并非在所有情况下都会崩溃。这包括其他答案中概述的许多技术。

仅当您使用 64 位版本的 Windows 并且您位于由 Windows 内核调用的函数中时,才会出现此问题。在 32 位版本的 Windows 中,可以从调用内核的代码中捕获异常或无效操作,但在 64 位版本的 Windows 中这是不可能的。 Windows 本身会在用户/内核边界捕获错误,然后忽略!这被认为是比每次都使程序崩溃更好的结果,因为在 32 位中运行良好的 catch 块不再有机会处理错误。

您应该仍然可以使用 ExitProcessTerminateProcess 立即停止该过程,但我还没有尝试过。

【讨论】:

    【解决方案2】:

    只需将一个数字除以零,

    int div = 1;
    div--;
    int cr = (any number)/div;
    

    【讨论】:

      【解决方案3】:

      这是我用来使我的应用程序崩溃的原因。我想它和你的一样。在发布模式下,它也会崩溃。

      *(int*)0 = 1;
      

      【讨论】:

        【解决方案4】:

        Assert( NULL ) 将使您的应用程序在调试模式下崩溃。我认为您不想让发布版本崩溃,但如果是这样,您可以使用Verifythere/both。

        其他导致崩溃的简单方法是使用带有错误格式说明符的sprintf,例如在预期“%d”时输入字符串。

        【讨论】:

          【解决方案5】:
          1. abort() 在释放模式下工作

          2. 在 64 位操作系统上编译 win64 平台时应用崩溃。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-26
            • 2013-08-20
            • 2021-08-28
            相关资源
            最近更新 更多