多线程服务器的结构化异常处理
时间:2020-03-06 15:02:53 来源:igfitidea点击:
本文很好地概述了为什么结构化异常处理不好。有没有一种方法可以克服本文中提到的问题,而具有使服务器停止崩溃的鲁棒性?
我有一个服务器软件,可同时运行约400个连接的用户。但是,如果发生崩溃,则所有400位用户都会受到影响。我们添加了结构化异常处理并享受了一段时间的结果,但是由于某些崩溃导致整个服务器挂起(最终比崩溃并重新启动自身更糟糕),最终不得不将其删除。
所以我们有这个:
- 使用SEH:在大多数崩溃中,只有400名用户中有1名遇到问题
- 不使用SEH:如果有任何用户崩溃,则所有400个都将受到影响。
- 但是有时SEH:服务器挂起,所有400个都受影响,并且将来尝试连接的用户也受到影响。
解决方案
将程序分解为工作进程和单个服务器进程。服务器进程将处理初始请求,然后将其移交给工作进程。如果工作进程崩溃,则仅该工作进程上的用户会受到影响。正如我们所发现的那样,不要将SEH用于一般异常处理,它会并且很容易使我们陷入僵局,并且无论如何我们仍然会崩溃。
使用SEH是因为程序随机崩溃是一个坏主意。可以撒在程序上以使其停止崩溃的不是魔术般的灰尘。跟踪并修复导致崩溃的错误是正确的解决方案。
当我们确实需要处理结构化异常时,可以使用SEH。拉里·奥斯特曼(Larry Osterman)在后续文章中解释了需要SEH的情况:内存映射文件,RPC和安全边界转换。
修复程序中的错误? ;)
我个人将保留SEH处理程序,让它们转出调用堆栈,以了解访问冲突或者发生的任何情况并修复问题。 "有时服务器挂起"问题可能是由于具有SEH异常的线程将线程锁定而导致的死锁,因此不太可能与我们正在使用SEH本身有关。