Название: Действия при аварийном завершении программы Отправлено: 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 - это вообще безобразие Название: 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/ |