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

标签 c++ windows

无论如何,我都不是 Windows 开发人员(!),但我目前正在从事仅 Windows 项目。

该项目非常历史悠久,很多人都在致力于它。看起来最初的开发团队采用了一本关于反模式的大本旧书,并在他们认为可能的地方应用了所有这些内容。修复错误很困难。比应有的困难得多。有很多崩溃和一般的东西变慢。当东西崩溃时,仍然需要清理一些资源。特别是,程序可能为工具栏保留一些屏幕空间 - 不清理该空间意味着屏幕的一部分将无法供其他程序使用。

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

  • 使用 C 风格信号(<csignal> -- 在所有定义的信号上设置信号处理程序)
  • 使用 std::set_terminate
  • 使用 DllMain 设置信号/终止
  • 使用 __try/__except
  • 使用 system通过注册表调用程序的拷贝并通信资源( HWND )。虽然这个机会渺茫,但我必须尝试一下。

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

我们使用的是 Visual Studio 2012,因此我们有 C++(ish)11(ish) 可用。

最佳答案

正如评论所指出的,放弃 C++。一旦您的程序到处都损坏了内存,您就不能再信任 C++ 库了。

第一步是弄清楚您要使用react的事件。 “SegFault”是 POSIX。 Windows 存在访问冲突(著名的 C0000005)。这也可能是您被信号误导的原因。它是一点 POSIX 最终用 C 语言实现的。Windows 根本不使用 signal

下一步是你如何应对它们。我的偏好是 Vectored Exception Handler 。结构化异常处理假设堆栈在某种程度上是正常的,这也是一个猜测。 vector 异常处理程序实际上是硬跳转。我们不会返回,只是在调用 TerminateProcess 之前进行清理。再次相同的模式:如果您的程序状态可信,您将使用 ExitProcess,但我们不可信。

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

自杀

关于c++ - 如何在 Windows 上拦截 C++ 中的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46910388/

相关文章:

c++ - 如何通过 g++ 链接 wsock32 库?

windows - 我如何从 Windows 64x 运行调试命令

windows - Delphi自删除程序

c++ - 同一段代码,在 Windows 和 Linux 上的不同行为

c++ - 为什么 'new'类初始化失败

windows - 无法在 pentaho 数据集成中找到日志文件

c++ - windows下extern函数调用make undefined reference

c# - 在 C# 的 VS 2012 Express for Desktop 中链接到 Windows API 的问题

C++ 将值移至数组开头

c++ - 如何在 Windows API 中更新用户创建的位图