![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
Здравствуйте!
Хочу сделать костыль для программ, которые должны работать 24x7, но которые иногда "падают". Нашёл такую функцию - RegisterApplicationRestart. Сделал вот такой исходник, который нужно просто включить в проект
При падении приложения оно само перезапускает себя. И это работает для неструктурированных исключений (обращение по NULL, деление на 0 и т.п.), но если происходит структурированное исключение, например std::bad_alloc, то выдаётся сообщение
после нажатия на Ok программа просто закрывается и всё. Мне нужно, чтобы при выкидывании структурированных исключений программа просто "падала", тогда система Microsoft Error Reporting её просто перезапустит. В этой теме на СО предлагают обернуть весь код try - catch (...). Я такое сделал, но, если исключение происходит не в GUI-потоке, то сообщение всё равно появляется. Оборачивать все потоки в try - catch не вариант, т.к. хотелось бы получить результат одним простым движением, а не перелопачивать кучу своего и чужого кода. Ещё в одной теме советуют либо переписать функцию abort (пробовал - не работает) либо вызвать функцию _set_abort_behavior (пробовал - с тем же результатом). Вопрос: как отключить вывод этого окна или как перехватить его вывод и вместо него сделать что-нибудь нехорошее (например записать что-нибудь по NULL) ? P.S. Не ругайте, пожалуйста, но я не помню как по-русски будет unexpected exception, поэтому назвал его неструктурированным )) P.P.S. Я, естественно, понимаю, что нужно правильно писать программы, нужно всё и вся отлаживать, делать try - catch на любой чих и т.п., но есть пара нюансов, которые вам, скорее всего, неинтересны. Это сообщение отредактировал(а) borisbn - 2.10.2014, 13:17 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
xvr, спасибо, но, похоже, я зря выбросил комментарии из кода ))
На самом деле функция initAutoRecovery выглядит у меня так
Другими словами - пробовал... не помогает -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: нет Всего: 17 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
При старте программы dummy - статическая переменная для вызова initAutoRecovery() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| DarthTon |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 7.2.2009 Репутация: 5 Всего: 6 |
Собствено, в Filter можно уже и самому перезапустить приложение и не надеяться на WER. Это сообщение отредактировал(а) DarthTon - 8.10.2014, 14:14 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
DarthTon, не помогает. Всё равно выдаётся это окошко с ссобщением
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| DarthTon |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 7.2.2009 Репутация: 5 Всего: 6 |
А можно мне какой-нибудь тестовый кусок кода? А то в моём случае работало с С++ ексепшенами?
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
DarthTon, я добавил в начало функции Filter код
и не видел этого сообщения. Так с налёту трудно.. У меня проект на Qt и я запускаю Qt-шный поток, в котором и выкидывается std::bad_alloc(). Я специально в QThread::run() сделал std::vector::resize( 3 ГБ ) и вижу это сообщение от Microsoft. Вот если сделать обращение по нулевому адресу, то я захожу в функцию Recover и всё идёт по плану. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| DarthTon |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 7.2.2009 Репутация: 5 Всего: 6 |
Возможно, что-то потом переопределяет UnhandledExceptionFilter либо вызывает abort() напрямую, т.к. UnhandledExceptionFilter вроде ловит все С++ исключения нормально. Надо бы глянуть стек вызова и SEH-фреймы в TIB когда выпадает Runtime error!.
|
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 4 Всего: 17 |
||||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
UnhandledExceptionFilter ничего не знает от С++ исключениях, он ловит SEH исключения.
читать по 2 ссылкам: http://msdn.microsoft.com/ru-ru/library/1deeycx5.aspx http://msdn.microsoft.com/ru-ru/library/5z4bw5h5.aspx Это сообщение отредактировал(а) Dem_max - 9.10.2014, 06:27 -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
korian, и в релизе и в дебаге поведение одинаковое, если запускать из проводника. Если запускать из студии под дебагом, то, ессно, студия останавливается в том месте, где было вызвано исключение, но мне нужно не это.
Dem_max, поставил опцию /EHa и сделал такой код
сообщение "in trans_func" не показывается, а неубиенное окно от M$ - да. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
![]() забавно смотрится... Может это - ответ на мой вопрос ))) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Выложи тестовый проект который имитирует данное поведение, я посмотрю у себя.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
Вот проект (в аттаче).
стоит потому, что если программа отработала менее 60 секунд, то система не будет её восстанавливать (это - из документации по функции RegisterApplicationRestart) Если разремить строку
и заремить следующую, то программа просто перезапускается Присоединённый файл ( Кол-во скачиваний: 2 )
test_auto_recovery.zip 7,38 Kb-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| DarthTon |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 7.2.2009 Репутация: 5 Всего: 6 |
C++ исключения работаю через SEH и RaiseException. Код исключения в таком случае - 'msc' | 0xE0000000 для MSVC компилятора. Просто С++ try/сatch блок устанавливает свой SEH-фрейм - __InternalCxxFrameHandler, который обрабатывает С++ исключение по возможности, и если он не может, просто передаёт исключение в следущий фрейм аж до UnhandledExceptionFilter. В x64 вместо SEH-фреймов - таблицы, но приницп тот же. Я проверил test_auto_recovery с UnhandledExceptionFilter. Исключение нормально ловится. Можно попробовать добавить векторный обработчик - AddVectoredExceptionHandler. Но его проблема в том, что он вызывается до струрных обработчиков, и в нём надо будет как-то отличать нормальные исключения от фатального. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
Так и есть. Спасибо большое. Как только я вызвал свою initAutoRecovery не до main(), а внутри (сразу перед a.exe();), то всё заработало так же, как и на тестовом проекте. Ещё раз огромное спасибо DarthTon, тему закрываю. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| vadya1976 |
|
|||
|
Unregistered |
||||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |