Субж: как реализовать повторный запуск программы при ее падении — например, как это сделано в Microsoft Visual Studio или explorer'е (когда происходит падение, студия перезапускается)?
Установка unhandled exceptions-фильтра не очень-то помогает (в программе много потоков и используются "местами неблагонадежные" ActiveX сторонних производителей — иногда программа может просто без звука упасть). Кусков кода сторонних разработчиков тоже много, а времени исправить все-все уже нет
Может есть еще какой-нибудь способ?
Здравствуйте, Ulfur, Вы писали:
U>Субж: как реализовать повторный запуск программы при ее падении — например, как это сделано в Microsoft Visual Studio или explorer'е (когда происходит падение, студия перезапускается)? U>Установка unhandled exceptions-фильтра не очень-то помогает (в программе много потоков и используются "местами неблагонадежные" ActiveX сторонних производителей — иногда программа может просто без звука упасть). Кусков кода сторонних разработчиков тоже много, а времени исправить все-все уже нет U>Может есть еще какой-нибудь способ?
Следить в другом процессе — если первый упадет, перезапустить.
Здравствуйте, g_i, Вы писали:
g_i>Здравствуйте, Ulfur, Вы писали:
U>>...
g_i>Следить в другом процессе — если первый упадет, перезапустить.
А разве студия или эксплорер создают для этих целей еще один процесс?
С созданием еще одного процесса появляется новый геморрой — понять, когда мы упали, а когда закрылись. Я понимаю, что существует много способов решения и этой проблемы, но неужели нельзя сделать это "изящней" в рамках одного процесса — успев еще сохранить данные работы юзверя?
Здравствуйте, Ulfur, Вы писали:
U>Может есть еще какой-нибудь способ?
Конкретно explorer перезапускается какой-то службой, которая висит на TerminateProcess. Проверяется очень просто: убиваем эксплорер при помощи TerminateProcess и он воскресает; убиваем при помощи ZwTerminateProcess и он не воскресает.
Здравствуйте, Ulfur, Вы писали:
U>Субж: как реализовать повторный запуск программы при ее падении — например, как это сделано в Microsoft Visual Studio или explorer'е (когда происходит падение, студия перезапускается)? U>Установка unhandled exceptions-фильтра не очень-то помогает (в программе много потоков и используются "местами неблагонадежные" ActiveX сторонних производителей — иногда программа может просто без звука упасть). Кусков кода сторонних разработчиков тоже много, а времени исправить все-все уже нет U>Может есть еще какой-нибудь способ?
Не знаю , может не в тему , но может подкинет информацию к размышлению-
explorer если прибить в рукопашную то он не перезапускаеться , по крайней мере
я не ждал достаточно долго чтобы это проверить...
Здравствуйте, Ulfur, Вы писали:
U>... U>Может есть еще какой-нибудь способ?
А что если так: если процесс все равно как-то убивается, код выгружается из памяти и подчищаются открытые хендлы, то в нашем потоке НАВЕРНОЕ вызовется какая-то функция, типа некоей ntdll-ной CloseHandle — уже после того, как мы упали.
Перехватить бы эту функцию, сохранить юзверьскую работу на диск и перезапустить процесс... Только вот как зовут эту функцию
Может кто знает — я с нтдлл не работал.
Программа будет работать только на Win 2k/XP
Re[2]: "Мягкое" падение программы
От:
Аноним
Дата:
03.07.06 11:29
Оценка:
Здравствуйте, Ulfur, Вы писали:
U>Здравствуйте, Ulfur, Вы писали:
U>>... U>>Может есть еще какой-нибудь способ?
U>А что если так: если процесс все равно как-то убивается, код выгружается из памяти и подчищаются открытые хендлы, то в нашем потоке НАВЕРНОЕ вызовется какая-то функция, типа некоей ntdll-ной CloseHandle — уже после того, как мы упали. U>Перехватить бы эту функцию, сохранить юзверьскую работу на диск и перезапустить процесс... Только вот как зовут эту функцию U>Может кто знает — я с нтдлл не работал. U>Программа будет работать только на Win 2k/XP
А что ва будете сохранять, если на момент перехвата user-ские данные уже благоплучно выгружены???
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Ulfur, Вы писали:
U>>Здравствуйте, Ulfur, Вы писали:
U>>>... U>>>Может есть еще какой-нибудь способ?
U>>А что если так: если процесс все равно как-то убивается, код выгружается из памяти и подчищаются открытые хендлы, то в нашем потоке НАВЕРНОЕ вызовется какая-то функция, типа некоей ntdll-ной CloseHandle — уже после того, как мы упали. U>>Перехватить бы эту функцию, сохранить юзверьскую работу на диск и перезапустить процесс... Только вот как зовут эту функцию U>>Может кто знает — я с нтдлл не работал. U>>Программа будет работать только на Win 2k/XP А> А что ва будете сохранять, если на момент перехвата user-ские данные уже благоплучно выгружены???
Я и имел в виду ту самую функцию, которая начнет выгружать данные при завершении (в нашем случае критическом) работы программы. Хотя вряд ли она документирована и экспортируется...
Здравствуйте, Ulfur, Вы писали:
U> но неужели нельзя сделать это "изящней" в рамках одного процесса — успев еще сохранить данные работы юзверя?
Если твой процесс, к примеру, налил в чужую память, сохранять данные не безопасно (вообще, не факт что какой-то код будет выполняться корректно). К падению процеса приводит обычно необрабатываемое исключение — т.е. ситуация, в которой программа не знает, что ей делать. В этом случае лучший вариант — стремительно упасть.
Здравствуйте, Ulfur, Вы писали:
U>Я и имел в виду ту самую функцию, которая начнет выгружать данные при завершении (в нашем случае критическом) работы программы. Хотя вряд ли она документирована и экспортируется...
Да нету скорее всего никакой функции. И CloseHandle не вызывается, а хендлы освобождает скорее всего ядро.
>Субж: как реализовать повторный запуск программы при ее падении — например, как это сделано в Microsoft Visual Studio или explorer'е (когда происходит падение, студия перезапускается)? >Может есть еще какой-нибудь способ?
можно написать малюсенький драйвер, который будет отслеживать запуск и выгрузку приложений. Если обнаруживается, что рассматриваемое приложение выгрузилось, а драйверу об этом не сообщили, значит, оно упало аварийно и подлежит повторному запуску
Пишем службу, которая смотрит за состоянием программы и смотрит, жива ли та. ДАнные пользователя программа автосохраняет каждые несколько минут. Если программа не отвечает, служба говорит пользователю, что что-то тут не так и не завершить ли ее. Если процесс вообще исчез, то происходит перезапуск проги.
Службу можно запустить в момент первого запуска программы и выгрузить при закрытии программы.
Здравствуйте, Ulfur, Вы писали:
U>Субж: как реализовать повторный запуск программы при ее падении — например, как это сделано в Microsoft Visual Studio или explorer'е (когда происходит падение, студия перезапускается)? U>Установка unhandled exceptions-фильтра не очень-то помогает (в программе много потоков и используются "местами неблагонадежные" ActiveX сторонних производителей — иногда программа может просто без звука упасть). Кусков кода сторонних разработчиков тоже много, а времени исправить все-все уже нет U>Может есть еще какой-нибудь способ?
Я конечно твоей ситуации не знаю, но то, что ты хочешь — изврат. Не проще-ли баги пофиксить?
Здравствуйте, Вумудщзук, Вы писали:
В>можно написать малюсенький драйвер, который будет отслеживать запуск и выгрузку приложений. Если обнаруживается, что рассматриваемое приложение выгрузилось, а драйверу об этом не сообщили, значит, оно упало аварийно и подлежит повторному запуску
PsSetCreateProcessNotifyRoutine — это конечно хорошо, вот только запуск процесса из драйвера — задача хоть и решаемая, но не предусмотренная дизайном ОС.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, Ulfur, Вы писали:
U>Субж: как реализовать повторный запуск программы при ее падении — например, как это сделано в Microsoft Visual Studio или explorer'е (когда происходит падение, студия перезапускается)?
Это уже встроено в Виндовс
Делайте службу, и при инсталляции пропишите ей Восстановление при сбоях.
Если сильно хочется GUI — тогда ставим соответствующую галочку у службы, и наслаждаемся ее внешним видом.
Если очень сильно не хочется париться — тогда превращаем в службу любое приложение с помощью INSTSRV.
Учим матчасть
>PsSetCreateProcessNotifyRoutine — это конечно хорошо, вот только запуск процесса из драйвера — задача хоть и решаемая, но не предусмотренная дизайном ОС.
разве дизайном ОС не предусмотрена ZwCreateProcess ?
Здравствуйте, Вумудщзук,
>>запуск процесса из драйвера — задача хоть и решаемая, но не предусмотренная дизайном ОС. В>разве дизайном ОС не предусмотрена ZwCreateProcess ?
Угу, есть такая неэкспортируемая ядром функция Она делает лишь небольшую часть работы CreateProcessW.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
N>Если сильно хочется GUI — тогда ставим соответствующую галочку у службы, и наслаждаемся ее внешним видом.
Будет работать если только пользователь работает в session 0 (есть такая колонка в диспетчере задач для процессов).
С терминалами, XP с переключением пользователей будет облом
Неоднократно обсуждался вопрос интерактивности служб.
Если "просто" перезапускать прогу со службы — только в session 0.
На других сессиях будет мучительно больно, и лишь только возможно приятно в конце.
Здравствуйте, Ulfur, Вы писали:
U>Субж: как реализовать повторный запуск программы при ее падении — например, как это сделано в Microsoft Visual Studio или explorer'е (когда происходит падение, студия перезапускается)?
Это прямо из серии: быстро поднявшийся фигурист не считается упавшим...
Может быть лучше программы писать так, чтобы они не падали?