Обработка структурированных исключений с помощью многопоточного сервера - PullRequest
4 голосов
/ 03 октября 2008

Эта статья дает хороший обзор того, почему плохая обработка структурированных исключений. Есть ли способ получить надежность, предотвращающую сбой вашего сервера, и преодолеть проблемы, упомянутые в статье?

У меня есть серверное программное обеспечение, которое одновременно запускает около 400 подключенных пользователей. Но если происходит сбой, затрагиваются все 400 пользователей. Мы добавили структурированную обработку исключений и некоторое время наслаждались результатами, но в конечном итоге пришлось ее удалить из-за некоторых сбоев, приводящих к зависанию всего сервера (что хуже, чем просто его аварийное завершение и перезагрузка).

Итак, у нас есть это:

  • С SEH: только 1 пользователь из 400 получает проблему в большинстве сбоев
  • Без SEH: если какой-либо пользователь получает сбой, затрагиваются все 400.
  • Но иногда с SEH: зависание сервера затрагивает все 400 и будущих пользователей, которые пытаются подключиться.

Ответы [ 3 ]

3 голосов
/ 03 октября 2008

Использование SEH из-за случайного сбоя вашей программы - плохая идея. Это не волшебная пыльца пикси, которую вы можете посыпать своей программой, чтобы она перестала падать. Отслеживание и исправление ошибок, вызывающих сбои, является правильным решением.

Использование SEH, когда вам действительно нужно обработать структурированное исключение, вполне нормально. Ларри Остерман сделал следующий пост, объясняющий , в каких ситуациях требуется SEH: файлы с отображением в памяти, RPC и переходы границы безопасности .

2 голосов
/ 03 октября 2008

Разбейте вашу программу на рабочие процессы и один серверный процесс. Процесс сервера будет обрабатывать начальные запросы, а затем передавать их рабочим процессам. В случае сбоя рабочего процесса затрагиваются только пользователи этого рабочего. Не используйте SEH для общей обработки исключений - как вы выяснили, это может и сделает вас широко открытыми для взаимоблокировок, и вы все равно можете потерпеть крах.

1 голос
/ 03 октября 2008

Исправить ошибки в вашей программе? ;)

Лично я бы оставлял обработчики SEH включенными, чтобы они выводили стек вызовов о том, где произошло нарушение доступа или что бы то ни было, и устраняли проблемы. Проблема «иногда зависает сервер», вероятно, вызвана взаимоблокировками, вызванными тем, что исключение SEH заблокировано потоком, и поэтому вряд ли связано с тем, что вы используете сам SEH.

...