12 июн. 2012 г.

Почему нельзя сразу перезапустить сбойное приложение?


Автор: Рэймонд Чен.
Оригинал статьи: Why do you have to wait for Windows Error Reporting to check for solutions before it restarts the application?

Leo Davidson интересуется, почему перезапуск приложения возможен только после поиска решений проблемы. Почему нельзя одновременно выполнять две задачи?
Во-первых, перезапускаемое приложение может сойти с ума, если увидит свою мёртвую копию. Я бы точно сошёл с ума, если бы проснулся утром и увидел рядом своё мёртвое тело.


Во время поиска решения службе регистрации ошибок Windows доступен каркас зависшего приложения, потому что ей могут понадобиться дополнительные сведения для ответа серверу. ("Была ли загружена процессом библиотека PI.DLL версии 3.14 в момент сбоя? Если да, то у меня есть представление о том, что пошло не так.") И если требуется отправить отчёт в Microsoft, должна быть возможность получить сведения для генерации отчёта об ошибке.
Теперь представьте, что вы сразу запускаете новую копию приложения. Если приложение работает лишь в одном экземпляре, оно будет искать свою копию и найдёт своё безжизненное тело посреди процесса вскрытия. Затем оно попытается отправлять мёртвой программе сообщения вида "Пользователь хочет открыть документ X; сделай, пожалуйста". Ответа не будет, поскольку программа мертва. Она никогда не ответит.
Некоторые программы даже не пытаются передавать какую-либо информацию. Они просто находят существующую копию программы и вызывают функцию SetForegroundWindow, переключаясь на её главное окно. Разумеется, они пытаются переключиться на зависшую программу.
Всё может быть хуже, когда вторая копия программы пытается получить информацию от своей существующей копии. Если существующая копия зависла, скорее всего, сбой был вызван повреждением внутренних структур данных программы. Когда вторая копия пытается извлечь повреждённые данные, она сама можеть потерпеть крах. Простой перезапуск приведёт к быстрорастущей куче мёртвых программ, и ваш экран будет завален сообщениями службы регистрации ошибок Windows раньше, чем вы успеет нажать кнопку «OK».
Сбойная программа фактически организовала против себя атаку типа «отказ в обслуживании».
Перед повторным запуском программы Windows должна надлежащим образом похоронить её предыдущую копию, потому что немногие программы готовы встретиться со своим трупом.
Дополнение. Другой распространённый случай: сбой программы при запуске. Автоматический перезапуск программы всего лишь создаёт ещё одну копию, которая сразу же потерпит крах. Мы снова ежесекундно получаем дюжину копий программы, каждая из которых аварийно завершает свою работу.

Комментариев нет:

Отправить комментарий