Russian Qt Forum
Ноябрь 23, 2024, 05:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Действия при аварийном завершении программы  (Прочитано 22960 раз)
Nidxogg
Гость
« : Август 26, 2014, 19:21 »

Добрый день, подскажите
Возможно как-то в программе отловить её аварийное завершение и выполнить какие-либо действия.

Чисто прикладное - программа иногда падает + виснет в процессах. Нужно запустить новый экземпляр и убрать старый( убрать старый из процессов важнее).

win 7 x64 (но хорошо бы кроссплатформенный вариант)
mingw

Записан
Bepec
Гость
« Ответ #1 : Август 26, 2014, 19:26 »

Watcher. Лучше его ещё не придумали. И не придумают.
Записан
Nidxogg
Гость
« Ответ #2 : Август 26, 2014, 19:57 »

Watcher. Лучше его ещё не придумали. И не придумают.
Ссылку можно?

P.S. Действия при аварийном завершении программы хочется выполнить в этой же программе
Записан
Bepec
Гость
« Ответ #3 : Август 27, 2014, 00:00 »

Увы, нельзя никак воскресить программу. Можно попытаться перехватывать исключения определённого типа и там предпринимать действия, но это охватывает далеко не все случаи смерти.

Watcher - шаблон "Наблюдатель". Когда имеется маленькая независимая программа, отслеживающая состояние основной и убивающая/возрождающая её снова.

Во всяком случае я встречал только пару программ, способных восстановиться после серьёзной ошибки, но к сожалению они далеко не на С++ были написаны.

Update: Вот вы написали что она виснет. Если вы точно знаете причину, вы почините программу и она не будет виснуть.

Проще говоря - в программе должны быть описаны все (повторюсь) ВСЕ случаи вылетов/исключений/попыток закрытия/порчи данных/стороннего вмешательства и прочих гадостей Веселый
« Последнее редактирование: Август 27, 2014, 00:02 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 27, 2014, 09:21 »

Чисто прикладное - программа иногда падает + виснет в процессах. Нужно запустить новый экземпляр и убрать старый( убрать старый из процессов важнее).
Ну а чем это будет лучше чем стандартный сервис ОС? Если ничем, скорее хуже - так зачем тратить на это время и силы?  Улыбающийся

Возможно как-то в программе отловить её аварийное завершение и выполнить какие-либо действия.
Использовать try/catch. Затыкать таким образом фатальные ошибки (напр обращение по невалидному адресу) нет смысла - их надо исправлять
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Август 27, 2014, 09:54 »

Так хотелось бы нормальный бэктрейс при падении под виндой, но под мингвом я так и не нашел как такое сделать. Грустный
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Август 27, 2014, 16:26 »

Да, мне тоже это интересно. Т.к. для Linux-а можно "потырить" реализацию из QtCreator:
https://qt.gitorious.org/qt-creator/qt-creator/source/61276ab636a29e6b1f8e13afbf498f9d43e15535:src/tools/qtcreatorcrashhandler

Но вот для Windows - непонятно..
Записан

ArchLinux x86_64 / Win10 64 bit
Nidxogg
Гость
« Ответ #7 : Август 27, 2014, 18:18 »

Цитировать
Проще говоря - в программе должны быть описаны все (повторюсь) ВСЕ случаи вылетов/исключений/попыток закрытия/порчи данных/стороннего вмешательства и прочих гадостей
Это очевидно
Но нет возможности отладиться на машине, на которой в итоге будет работать программа.
Поэтому выход с каким-нибудь диалоговым окном или перезапуском программы в рабочем порядке все же лучше стандартного краша на момент обнаружения ошибки.

Цитировать
Так хотелось бы нормальный бэктрейс при падении под виндой, но под мингвом я так и не нашел как такое сделать.
А под чем нашли? Подмигивающий


Цитировать
Ну а чем это будет лучше чем стандартный сервис ОС? Если ничем, скорее хуже - так зачем тратить на это время и силы?  Улыбающийся
Заставить лезть пользователя убить процесс ручками?
« Последнее редактирование: Август 27, 2014, 18:21 от Nidxogg » Записан
Bepec
Гость
« Ответ #8 : Август 27, 2014, 18:36 »

Сервис если зависает, то система его перезапускает. Там спец система для этого.

А вот про "нет возможности отладиться на машине" бессмысленно. На любой машине будут одни и те же аварийные ситуации. Потому их надо описать все. Но это только в идеальном случае. И нет никаких гарантий что участок памяти с кодом восстановления не будет переписан.

PS а раз память могут затереть, нужно контролировать память, иметь где то эталон для сверки и прочая прочая.
« Последнее редактирование: Август 27, 2014, 18:40 от Bepec » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #9 : Август 27, 2014, 18:50 »

Для крэшдампов, вроде, только google breakpad из живого и работоспособного есть, я лично пробовал, работает.

А для отслеживания состояния, как сказал Верес, надо написать отдельный процесс watchdog, который будет по внешнему интерфейсу пинговать сервис и если тот не откликается - прибивать. Если сделаешь этот сервис системной службой, то винда будет автоматом его перезапускать, если выставить нужную опцию при регистрации сервиса.
Записан

Гугль в помощь
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Август 28, 2014, 07:18 »

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

Но нет возможности отладиться на машине, на которой в итоге будет работать программа.
Делайте лог-файл который юзверь может Вам послать.

Да, а у людей на OSX crashReport автоматом + кнопка Send. Развертка стеков вызовов всех ниток, список загруженных либов и еще много чего  Улыбающийся
Записан
Bepec
Гость
« Ответ #11 : Август 28, 2014, 07:43 »

Хорошо вам, на OSX. А нам, виндузятникам, приходится логировать более тщательно и отлаживать вслепую Улыбающийся

Да, с Watcher'ом возни нет. Вообще. Минут 10 на простейший потратите, который процесс будет поднимать.
Другой вопрос что если виснет, то повторюсь - проблема в вашем коде.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #12 : Август 28, 2014, 08:35 »

еще интереснее - как сделать если программа упала, а на входе пользователь вводил логин\пароль - их негде хранить ?
Записан
vizir.vs
Гость
« Ответ #13 : Август 28, 2014, 10:42 »

Хорошо вам, на OSX. А нам, виндузятникам, приходится логировать более тщательно и отлаживать вслепую Улыбающийся

Да, с Watcher'ом возни нет. Вообще. Минут 10 на простейший потратите, который процесс будет поднимать.
Другой вопрос что если виснет, то повторюсь - проблема в вашем коде.

Для винды тоже есть либы для создания и пересылки коре дампов
Записан
Bepec
Гость
« Ответ #14 : Август 28, 2014, 10:56 »

Они есть, но неудобочитаемые, глючные и страшные.

to qate - поступать как и все нормальные программы. Сохранять данные СРАЗУ при авторизации.
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.063 секунд. Запросов: 22.