无论如何,我都不是 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/