Russian Qt Forum

Программирование => Общий => Тема начата: Nidxogg от Август 26, 2014, 19:21



Название: Действия при аварийном завершении программы
Отправлено: Nidxogg от Август 26, 2014, 19:21
Добрый день, подскажите
Возможно как-то в программе отловить её аварийное завершение и выполнить какие-либо действия.

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

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



Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Август 26, 2014, 19:26
Watcher. Лучше его ещё не придумали. И не придумают.


Название: Re: Действия при аварийном завершении программы
Отправлено: Nidxogg от Август 26, 2014, 19:57
Watcher. Лучше его ещё не придумали. И не придумают.
Ссылку можно?

P.S. Действия при аварийном завершении программы хочется выполнить в этой же программе


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Август 27, 2014, 00:00
Увы, нельзя никак воскресить программу. Можно попытаться перехватывать исключения определённого типа и там предпринимать действия, но это охватывает далеко не все случаи смерти.

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

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

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

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


Название: Re: Действия при аварийном завершении программы
Отправлено: Igors от Август 27, 2014, 09:21
Чисто прикладное - программа иногда падает + виснет в процессах. Нужно запустить новый экземпляр и убрать старый( убрать старый из процессов важнее).
Ну а чем это будет лучше чем стандартный сервис ОС? Если ничем, скорее хуже - так зачем тратить на это время и силы?  :)

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


Название: Re: Действия при аварийном завершении программы
Отправлено: Пантер от Август 27, 2014, 09:54
Так хотелось бы нормальный бэктрейс при падении под виндой, но под мингвом я так и не нашел как такое сделать. :(


Название: Re: Действия при аварийном завершении программы
Отправлено: kuzulis от Август 27, 2014, 16:26
Да, мне тоже это интересно. Т.к. для Linux-а можно "потырить" реализацию из QtCreator:
https://qt.gitorious.org/qt-creator/qt-creator/source/61276ab636a29e6b1f8e13afbf498f9d43e15535:src/tools/qtcreatorcrashhandler

Но вот для Windows - непонятно..


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

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


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


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Август 27, 2014, 18:36
Сервис если зависает, то система его перезапускает. Там спец система для этого.

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

PS а раз память могут затереть, нужно контролировать память, иметь где то эталон для сверки и прочая прочая.


Название: Re: Действия при аварийном завершении программы
Отправлено: navrocky от Август 27, 2014, 18:50
Для крэшдампов, вроде, только google breakpad из живого и работоспособного есть, я лично пробовал, работает.

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


Название: Re: Действия при аварийном завершении программы
Отправлено: Igors от Август 28, 2014, 07:18
Поэтому выход с каким-нибудь диалоговым окном или перезапуском программы в рабочем порядке все же лучше стандартного краша на момент обнаружения ошибки.
Палка о двух концах. Показывая такое окно Вы тем самым признаете что Ваше приложение "работает неустойчиво". А главное - нет дешевого способа это сделать, с "вотчером" возни предостаточно.

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

Да, а у людей на OSX crashReport автоматом + кнопка Send. Развертка стеков вызовов всех ниток, список загруженных либов и еще много чего  :)


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Август 28, 2014, 07:43
Хорошо вам, на OSX. А нам, виндузятникам, приходится логировать более тщательно и отлаживать вслепую :)

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


Название: Re: Действия при аварийном завершении программы
Отправлено: qate от Август 28, 2014, 08:35
еще интереснее - как сделать если программа упала, а на входе пользователь вводил логин\пароль - их негде хранить ?


Название: Re: Действия при аварийном завершении программы
Отправлено: vizir.vs от Август 28, 2014, 10:42
Хорошо вам, на OSX. А нам, виндузятникам, приходится логировать более тщательно и отлаживать вслепую :)

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

Для винды тоже есть либы для создания и пересылки коре дампов


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Август 28, 2014, 10:56
Они есть, но неудобочитаемые, глючные и страшные.

to qate - поступать как и все нормальные программы. Сохранять данные СРАЗУ при авторизации.


Название: Re: Действия при аварийном завершении программы
Отправлено: navrocky от Август 28, 2014, 11:00
Да, а у людей на OSX crashReport автоматом + кнопка Send. Развертка стеков вызовов всех ниток, список загруженных либов и еще много чего  :)

В Linux в KDE приложениях тоже отличные крэш репорты, так что мак не уникален в этом плане.


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Август 28, 2014, 11:11
А если учесть что OSX на деле всего лишь linux, тогда вообще никаких между вами разногласий :D


Название: Re: Действия при аварийном завершении программы
Отправлено: Old от Август 28, 2014, 11:16
А если учесть что OSX на деле всего лишь linux
Нет.


Название: Re: Действия при аварийном завершении программы
Отправлено: GreatSnake от Август 28, 2014, 12:32
А если учесть что OSX на деле всего лишь linux
Да уж... Вот ведь не знаешь, а делаешь такие громкие заявления. Зачем ???


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Август 28, 2014, 13:35
Цитировать
В OS X используется ядро XNU, основанное на микроядре Mach и содержащее программный код разработанный компанией Apple, а также код из ОС NeXTSTEP и FreeBSD.

Цитировать
После приобретения NeXT компанией Apple, микроядро Mach было обновлено до версии 3.0, компоненты ядра BSD были обновлены с использованием наработок проекта FreeBSD, а Driver Kit был заменён на C++ API для драйверов под названием I/O Kit.

Т.е. используются наработки FreeBsd, таким образом оно является его наследником и UNIX подобной системой.

Linux - устоявшееся название всех UNIX подобных систем для не специалистов.  

Вывод : тот же линукс.

PS по поводу "зачем?" - чтобы проверять свои знания и искать в них ошибки. Не скажешь - не поправят. Не поправят - буду заблуждаться. Буду заблуждаться - обязательно где то сяду в лужу. Сяду в лужу - буду плакать :D А тут, на форуме, можно как раз получить информацию из нескольких источником и оспорить её.


Название: Re: Действия при аварийном завершении программы
Отправлено: GreatSnake от Август 28, 2014, 13:43
Linux - устоявшееся название всех UNIX подобных систем для не специалистов.
Вывод : тот же линукс.
Да уж... Нет чтобы промолчать в очередной раз говоришь глупости :(

Лучше посмотри на Unix History (http://www.levenez.com/unix/) и найдёшь где там линукс :)


Название: Re: Действия при аварийном завершении программы
Отправлено: Old от Август 28, 2014, 13:44
Linux - устоявшееся название всех UNIX подобных систем для не специалистов.  
Но мы здесь специалисты, поэтому, вы говорите просто глупость. :)

Вывод : тот же линукс.
Нет. :)


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Август 28, 2014, 13:59
Увы, линуксом называют всё, что не винда. (98% моих знакомых так считают. 2% приходятся на гентушника и красношапочника :) )
Все unix подобные системы. Конечно это не относится к людям, работающим с ними, но это явно не "неспециалисты".

Это уже нарицательное, так же как и "окна", "ксерокс". В этом переубедить меня у вас не получится. Слишком много людей из моего окружения так считают.

PS я не специалист в unix подобных системах. Максимум моих возможностей - написание под них программ и настройка по мануалам.


Название: Re: Действия при аварийном завершении программы
Отправлено: qate от Сентябрь 01, 2014, 11:40
to qate - поступать как и все нормальные программы. Сохранять данные СРАЗУ при авторизации.

вопросы был как их "вспомнить" если программа упала (для авто логина)



Название: Re: Действия при аварийном завершении программы
Отправлено: GreatSnake от Сентябрь 01, 2014, 13:12
вопросы был как их "вспомнить" если программа упала (для авто логина)
При старте сохраняешь признак старта, который при завершении удаляешь.
Если при старте этот признак есть, значит "программа упала".


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Сентябрь 01, 2014, 14:24
Берёшь при нажатии кнопки Start сохраняешь логин/пароль/данные для авторизации в файл, при окончании, как верно заметил GreatSnake - удаляешь.

Файл можно заменить на шифрованное хранилище, реестр, сервер и прочая прочая :)


Название: Re: Действия при аварийном завершении программы
Отправлено: qate от Сентябрь 01, 2014, 14:32
сохранять в файл очевидно нельзя - как еще можно ?
зы в шифрованный тоже нельзя т.к. иначе его можно нештатно использовать


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Сентябрь 01, 2014, 14:35
шифруем с хешем даты запуска :) Реестр можно. Или дописывать в сам exe.


Название: Re: Действия при аварийном завершении программы
Отправлено: qate от Сентябрь 01, 2014, 15:07
шифруем с хешем даты запуска :) Реестр можно. Или дописывать в сам exe.

а расшифровать как ?
реестр не вариант, решение должно быть для windows и linux
модификация exe - это вообще безобразие


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Сентябрь 01, 2014, 15:53
Любая система при знании её работы не является защитой.
Расшифровывать так же как и зашифровывали, только наоборот.


И вообще вопрос стоит так - у нас есть автологин.
=> пароль и username должны где то храниться
=> их могут подменить
=> не стоит заморачиваться, подменят :D



Название: Re: Действия при аварийном завершении программы
Отправлено: vizir.vs от Сентябрь 01, 2014, 16:24
шифруем с хешем даты запуска :) Реестр можно. Или дописывать в сам exe.

а расшифровать как ?
реестр не вариант, решение должно быть для windows и linux
модификация exe - это вообще безобразие

У Qt есть класс QSettings, в котором можно сохранять настройки. QSettings можно настроить так, что для винды он будет хранить данные в реестре, а для линукса в своем, линуксовом месте (там все зависит от конкретной системы)


Название: Re: Действия при аварийном завершении программы
Отправлено: Igors от Сентябрь 02, 2014, 08:16
PS по поводу "зачем?" - чтобы проверять свои знания и искать в них ошибки. Не скажешь - не поправят. Не поправят - буду заблуждаться. Буду заблуждаться - ...
Вы практикуете это уже пару лет - но на деле все сводится к банальному "что-то слышал, повторю" - но это почему-то это всегда не в тему  :)

Возвращаясь к теме - неясно какая цель? Разумно выглядит сначала наладить хоть какой-то лог, а затем помаленьку его улучшать. Зачем что-то шифровать ???


Название: Re: Действия при аварийном завершении программы
Отправлено: qate от Сентябрь 02, 2014, 10:20
Любая система при знании её работы не является защитой.

openssl, например, будет опровержением данного утверждения

Цитата: Bepec
Расшифровывать так же как и зашифровывали, только наоборот.

если ключ кранить в исполняемом файле, то это не защита

Цитата: Bepec
И вообще вопрос стоит так - у нас есть автологин.
=> пароль и username должны где то храниться
=> их могут подменить
=> не стоит заморачиваться, подменят :D

гдето так
пока автологин и не реализовываю, если будут лучшие мысли - обдумаю


Название: Re: Действия при аварийном завершении программы
Отправлено: qate от Сентябрь 02, 2014, 10:22
У Qt есть класс QSettings, в котором можно сохранять настройки. QSettings можно настроить так, что для винды он будет хранить данные в реестре, а для линукса в своем, линуксовом месте (там все зависит от конкретной системы)

насколько я понял фразу про реестр - было предложение там "прятать" данные авторизации, что не приемлемо




Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Сентябрь 02, 2014, 11:37
реестр это тот же файл. Куда бы вы не пошли по этому тернистому пути, вы будете всё равно хранить в файле) Пусть он по разному будет называться, шифроваться и иметь свои особенности, но  увы, только файл хранит данные.
PS исключая конечно всякие внешние ключи :)


Название: Re: Действия при аварийном завершении программы
Отправлено: GreatSnake от Сентябрь 02, 2014, 11:54
но  увы, только файл хранит данные.
какое странное утверждение  :o
т.е. про Shared Memory (https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B5%D0%BC%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C) слышим впервые?


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Сентябрь 02, 2014, 12:28
Хранит, а не удаляет при потере напряжения. Между вылетом и запуском может быть перезагрузка. И где ваша shared memory будет?


Название: Re: Действия при аварийном завершении программы
Отправлено: GreatSnake от Сентябрь 02, 2014, 12:36
Хранит, а не удаляет при потере напряжения. Между вылетом и запуском может быть перезагрузка. И где ваша shared memory будет?
Т.е. по твоей логике после перезагрузки системы бедная программка должна будет тоже перегрузиться?
Не думаю, что автору нужно будет такое поведение.
Тем более, что логин-инфо обычно хранится в рамках одной сессии, коей после перезагрузки системы уже не будет.


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Сентябрь 02, 2014, 13:52
Авто-логин подразумевает, что вводишь один раз, после чего логин происходит автоматически при запуске программы.
Хотя об этом надо спросить у ТС-са. Уж очень невнятные у него требования :)


Название: Re: Действия при аварийном завершении программы
Отправлено: qate от Сентябрь 03, 2014, 08:38
Хранит, а не удаляет при потере напряжения. Между вылетом и запуском может быть перезагрузка. И где ваша shared memory будет?

пережить перезагрузку не стоит задача, считаю что это уже совсем нештатное поведение


Название: Re: Действия при аварийном завершении программы
Отправлено: vizir.vs от Сентябрь 03, 2014, 08:40
У Qt есть класс QSettings, в котором можно сохранять настройки. QSettings можно настроить так, что для винды он будет хранить данные в реестре, а для линукса в своем, линуксовом месте (там все зависит от конкретной системы)

насколько я понял фразу про реестр - было предложение там "прятать" данные авторизации, что не приемлемо




Хватает мелкомягких приложений, которые хранят пароли в реестре. В зашифрованном виде, разумеется. Например Outlook Express (см. здесь  (http://www.e-reading.me/chapter.php/129067/93/Klimenko_-_Nedokumentirovannye_i_maloizvestnye_vozmozhnosti_Windows_XP.html))


Название: Re: Действия при аварийном завершении программы
Отправлено: qate от Сентябрь 03, 2014, 08:43
про shredmemory также думал, но там тоже есть возможность просмотра обмена с ней
идеалом будет решение, когда я сам как разработчик, не смогу обойти свою защиту


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Сентябрь 03, 2014, 09:25
Ухаха :D Это гениальное решение будет. Поделитесь пожалуйста, когда реализуете :)

PS всегда мечтал взглянуть на ИИ в действии.


Название: Re: Действия при аварийном завершении программы
Отправлено: qate от Сентябрь 03, 2014, 09:54
Ухаха :D Это гениальное решение будет. Поделитесь пожалуйста, когда реализуете :)

PS всегда мечтал взглянуть на ИИ в действии.

пример - openssl (разработчик не сможет обойти шифрование не зная ключи)


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Сентябрь 03, 2014, 10:08
Ну как бы там подразумевается наличие клиента и сервера, двух сторон. Собственно на этом и строится система - что имея ключи лишь одной стороны нельзя расшифровать данные.

У вас же имеется одна сторона, имеющая все данные о шифровании :)


Название: Re: Действия при аварийном завершении программы
Отправлено: vizir.vs от Сентябрь 03, 2014, 11:02
Ну как бы там подразумевается наличие клиента и сервера, двух сторон. Собственно на этом и строится система - что имея ключи лишь одной стороны нельзя расшифровать данные.

У вас же имеется одна сторона, имеющая все данные о шифровании :)

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


Название: Re: Действия при аварийном завершении программы
Отправлено: Bepec от Сентябрь 03, 2014, 11:15
Неуязвимость ssl в том, что ключи генерятся при каждом подключении.

Просто сохранив ключ мы получаем обычный алгоритм шифрования. Который легко взламывается, имея исходники и/или опыт в реверс инжиринге.

К тому же ssl не защищает, если у вас есть доступ к клиенту и серверу :D В том вся и фишка.

PS но есть способ получить не взламываемый для создателя алгоритм - это ИИ (искусственный интеллект). Если он будет при каждом сохранении генерить свой алгоритм шифрования, то это ведёт к невозможности его взломать. Так же возможно создание алгоритма шифрования непонятного человеку :D Уже есть прецендент создания алгоритма оптимизации, который непонятен человеку. Кстати надо бы уточнить - сумели разобраться или нет :D  

Ссылка для интересующихся - http://habrahabr.ru/post/187278/