本文 很好地概述了为什么结构化异常处理不好。有没有一种方法可以在克服文章中提到的问题的同时,获得阻止服务器崩溃的稳健性?

我有一个服务器软件,可以同时运行大约 400 个连接的用户。但如果发生崩溃,所有 400 个用户都会受到影响。我们添加了结构化异常处理并享受了一段时间的结果,但最终不得不删除它,因为一些崩溃导致整个服务器挂起(这比仅仅崩溃并重新启动更糟糕)。

所以我们有这个:

  • 与SEH:400 名用户中只有 1 名用户遇到大多数崩溃问题
  • 没有SEH:如果任何用户发生崩溃,所有 400 名用户都会受到影响。
  • 但有时使用 SEH:服务器挂起,所有 400 个用户以及未来尝试连接的用户都会受到影响。
有帮助吗?

解决方案

将您的程序分解为工作进程和单个服务器进程。服务器进程将处理初始请求,然后将它们交给工作进程。如果工作进程崩溃,则只有该工作进程上的用户受到影响。不要使用 SEH 进行一般异常处理 - 正如您所发现的,它可能并且会让您很容易陷入死锁,并且无论如何您仍然可能崩溃。

其他提示

因为程序随机崩溃而使用 SEH 是一个坏主意。这不是你可以撒在程序上以使其停止崩溃的魔法仙尘。追踪并修复导致崩溃的错误是正确的解决方案。

当您确实需要处理结构化异常时,使用 SEH 就可以了。拉里·奥斯特曼(Larry Osterman)发表了后续帖子解释 哪些情况需要SEH:内存映射文件、RPC 和安全边界转换.

修复程序中的错误?;)

就我个人而言,我会保留 SEH 处理程序,让它们转储出访问冲突或发生的任何情况的调用堆栈,并解决问题。“有时服务器挂起”问题可能是由于具有 SEH 异常的线程保持某些锁定而引起的死锁,因此不太可能与您使用 SEH 本身的事实有关。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top