如何在Windows上拦截C ++中的段错误?

时间:2017-10-24 12:17:15

标签: c++ windows

我不是Windows开发人员(!),但我目前只处理Windows项目。

项目非常旧,很多的人一直在努力。原来的开发团队看起来像是一本反旧模式的旧书,并将它们全部应用到了所有可能的地方。修复错误很难。比应该的要困难得多。有很多崩溃,只是一般减慢的东西。当东西崩溃时,仍然需要清理一些资源。特别是,程序可以为工具栏保留一些屏幕空间 - 不清理该空间意味着屏幕的一部分不会被其他程序使用。

我根据其他各种人的尝试尝试了几种方法:

  • 使用c风格的信号(<csignal> - 在所有定义的信号上设置信号处理程序)
  • 使用std::set_terminate
  • 使用DllMain设置信号/终止
  • 使用__try / __除
  • 使用system调用程序副本并通过注册表传递资源(HWND)。这是一个很长的镜头,但我不得不尝试。

他们都没有按预期工作 - 除了system位,我根本无法运行任何错误处理代码。

我们正在使用Visual Studio 2012,因此我们可以使用C ++(ish)11(ish)。

1 个答案:

答案 0 :(得分:2)

如评论所述,请删除C ++。一旦你的程序在整个地方损坏了内存,你就不能再信任C ++库了。

第一步是找出你正在做出反应的事件。 “SegFault”是POSIX。 Windows有访问冲突(着名的C0000005)。这也可能是您被signal误导的原因。它有点POSIX最终在C. Windows中根本不使用signal

下一步是你对它们的反应。我的偏好是Vectored Exception Handler。结构化异常处理假设堆栈有点理智,这也是猜测。一个有效的异常处理程序实际上是一个艰难的跳跃。在调用TerminateProcess之前,我们不会返回,只是进行清理。再次使用相同的模式:如果您的程序状态可以信任,那么您将使用ExitProcess,但我们不会。

在Vectored Exception Handler中,您将查询操作系统是否存在该工具栏。不要相信你自己的程序:你不能相信它,而且,如果操作系统认为没有工具栏,那么就没有。使用操作系统返回的句柄,并销毁该工具栏。然后通过TerminateProcess

自杀
相关问题