【问题标题】:How can I handle an access violation in Visual Studio C++?如何处理 Visual Studio C++ 中的访问冲突?
【发布时间】:2013-01-14 16:11:31
【问题描述】:

通常访问冲突会终止程序,我无法使用 trycatch 捕获 Win32 异常。有没有办法让我的程序运行,即使在访问冲突的情况下?最好我想处理异常并向用户显示发生了访问冲突。

编辑:我希望我的程序非常健壮,即使是针对编程错误。我真正想避免的事情是程序终止,即使以某些损坏状态为代价。

【问题讨论】:

  • 什么?内存访问冲突?您应该编写程序以避免内存访问冲突。也许更多的上下文会对任何试图帮助你的人有用。
  • 为什么要向用户展示它,他们打算用它做什么?如果 a/v 在您的代码中,请修复它,它在您无法触摸的第 3 部分代码中,找到某种方法来检测它,并显示一些合适的消息,对不起,我不能做您想要的。放入日志文件并吞下它,但不要向用户显示。
  • 是的,我不会对用户大喊“访问违规”。这显然是要记录的内容。
  • 实际上,这有一个人们似乎错过的优势。如果你想优雅地退出怎么办?如果您想将错误报告发送回服务器怎么办?如果您想弹出一条消息说.. 出了点问题,您想保存状态并将数据发回给我们,以便我们可以在未来的版本中修复它吗?请注意,在大型组织中,程序员有好有坏。没有一个相当大的程序是完全没有错误的。

标签: visual-c++ exception-handling access-violation structured-exception


【解决方案1】:

在 Windows 中,这称为结构化异常处理 (SEH)。详情请看这里:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657%28v=vs.85%29.aspx

实际上,您可以注册以在发生异常时获取回调。由于显而易见的原因,您不能对所有异常都这样做。

使用 SEH,您可以检测到很多异常,包括访问违规,但不是全部(例如双堆栈错误)。即使有可检测到的异常,也无法保证异常发生后 100% 的稳定性。但是,通知用户、记录错误、将消息发送回服务器并正常退出可能就足够了。

【讨论】:

  • 当然可以让您的程序在面对访问冲突时继续运行。正如您自己所提到的,可以为事后调试保存状态(甚至对过程进行小型转储),或者发送错误报告,或者询问用户“发生这种情况时您在做什么”都是可能的......
  • 这并不一定意味着保持运行。这通常是在退出之前进行最后一分钟的清理......并且有一些你根本无法捕捉到的例外情况。
  • 对此有可能做很多事情。您可能会重新启动您的应用程序,以便给自己一个新的内存布局和初始化序列,然后重新加载您以前的上下文(或任务启动上下文)并从那里恢复......
  • 当您不知道导致问题的错误时,我不知道如何重建程序的状态。如果你知道这个错误,那为什么在运输代码中包含它?并且重新启动实际上不会使您的程序保持运行。除此之外,甚至根本无法处理双堆栈错误之类的事情,但我想这比访问冲突更严重。
  • 可能从“无法检测并保持程序运行”更改为“在捕获此类错误或退出所有程序后无法确保您的进程 100% 稳定”由于导致访问冲突的任何错误而导致的可能错误"
【解决方案2】:

我首先要说你的问题包含矛盾:

编辑:我希望我的程序非常健壮,......我真正想要避免的是程序终止,即使以某些损坏状态为代价。

在状态损坏时继续跛行的程序并不健壮,这是一种责任。


第二,各种意见。关于:

编辑:我希望我的程序非常健壮,即使是针对编程错误。 ...

如果编程错误指的是所有错误,那么这是不可能的。

如果 编程错误 你的意思是:“程序员滥用了某些 API,我想要错误消息而不是崩溃,那么编写所有代码并内置双重检查:例如,始终检查所有指针使用前的 NULL,即使“如果程序员没有犯错,它们就不能是 NULL”等等。(哦,你也可以考虑 使用 C++ ;-)

但是恕我直言,在任何 C++ 应用程序中都必须接受一定数量的程序崩溃问题。 (除非它是微不足道的,或者您将它用于军事或医疗用途(即便如此......)。


其他人已经提到了SEH——这是__try / __catch的“简单”问题。

也许你可以尝试与Windows Error Reporting (WER)成为朋友,而不是试图捕捉程序中的错误——我从来没有拉过这个,但据我所知,你可以通过OutOfProcessException...@987654323完全自定义它@。

【讨论】:

  • 我喜欢 Windows 错误报告的想法。感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
相关资源
最近更新 更多