Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с ошибками в критических приложениях 
:(
    Опции темы
drug007
Дата 14.1.2015, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



В разработке я придерживаюсь принципа "живой клетки" - она всячески сопротивляется попыткам нанести ей вред снаружи, но сразу же умирает, если что-то сломалось внутри нее. Так же и код - всячески сопротивляется попыткам сломать его например путем передачи неверных аргументов, но если внутри кода возникло недопустимое состояние, то с помощью ассерта падаем тут же (с логированием и прочим, конечно же). Это полезно, потому что заставляет устранять ошибку, а не маскировать ее.
Но это работает если десктопное приложение, например. А если демон у нас - просто падать нельзя, нужно обязательно восстанавливаться. Некоторые приложения можно в скрипте перезапускать при падании, но это не общее решение. Может кто поделиться инфой, как работают с ошибками в критическом коде?
PM MAIL   Вверх
konshyn
Дата 14.1.2015, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Я в своем демоне использую модель следящего процесса. У меня запускается два процесса: один - с основной логикой, второй - следит за первым, и если что-то случается, чего не должно было случиться и привело к краху демона, то он попросту перезапускается (считанные миллисекунды).
Но такая модель хороша только тогда, когда настройка программы происходит считанные доли секунды и не хранится критическая или, хотя бы, нужная информация, которая не должна теряться.
В принципе, защититься от таких ошибок, как stack overflow, segmentation fault невозможно, поэтому за все внутренние состояния отвечает программист.
Поэтому такая модель, как у меня, для восстановления после падения вполне подходит. Но есть одно НО: у меня тоже есть важная информация, которую собирает мой сервис. Я просто эту информацию скидываю через каждый интервал времени на диск; этот интервал составляет 10 секунд, поэтому если вдруг случится крах программы, максимальная потеря данных составит 10 секунд. Для меня это приемлемо.

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

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

Это сообщение отредактировал(а) konshyn - 14.1.2015, 13:36


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
drug007
Дата 14.1.2015, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



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

Опять же я согласен что полностью надежно сделать нельзя. Просто хотелось бы ознакомиться с другими соображениями на эту тему.
PM MAIL   Вверх
baldina
Дата 14.1.2015, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(drug007 @  14.1.2015,  14:07 Найти цитируемый пост)
я обычно использую ассерты

используйте исключения.
PM MAIL   Вверх
drug007
Дата 14.1.2015, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(baldina @ 14.1.2015,  14:20)
используйте исключения.

Если обнаружено нарушение логики, то исправить это невозможно без изменения кода, т.е. перехватывать такое исключение нет никакого смысла, а необработанное исключение тот же ассерт. Так что разницы не вижу. Тут даже не важно ассерты или исключения - это лишь механизм реализации контрактов в той или иной форме. Т.е. вопрос можно перефразировать так - оставлять ли контракты в боевом коде и если оставлять то в каком виде? 
PM MAIL   Вверх
baldina
Дата 14.1.2015, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(drug007 @  14.1.2015,  14:30 Найти цитируемый пост)
Если обнаружено нарушение логики

то ничго не остается как сообщить пользователю и убиться. но исключение позволяет обработать эту ситуацию более удобным способом.
к тому же многое зависит от архитектуры приложения: например если демон имеет несколько потоков для обработки запросов, то при крахе потока логично убивать поток а не всего демона.
PM MAIL   Вверх
drug007
Дата 14.1.2015, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(baldina @  14.1.2015,  17:23 Найти цитируемый пост)
то ничго не остается как сообщить пользователю и убиться.

Вот ключевой момент - в сложных системах, где есть множество разных модулей с независимой логикой, но которые взаимодействуют между собой, может возникнуть нарушение логики в одном из таких модулей и этот модуль должен прекратить работу. Значит код с единой логикой должен выделяться в отдельный модуль, а модули в свою очередь должны быть отдельными процессами, чтобы они могли упасть не ломая остальных?
Цитата(baldina @  14.1.2015,  17:23 Найти цитируемый пост)
при крахе потока логично убивать поток а не всего демона

Насколько я помню, крах потока не гарантирует что процесс остается в корректном состоянии? Ведь как минимум потоки автоматически расшаривают память процесса, по крайней мере в си и плюсах. И независимость потоков несравнима с независимостью процессов.
PM MAIL   Вверх
baldina
Дата 14.1.2015, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(drug007 @  14.1.2015,  19:12 Найти цитируемый пост)
крах потока не гарантирует что процесс остается в корректном состоянии

если вы поймали исключение (равно как и сработал assert), то крах еще только собирается. дальше все зависит от логики вашего приложения. например в хроме сбой на одной закладке не влияет на другие.

Это сообщение отредактировал(а) baldina - 14.1.2015, 23:05
PM MAIL   Вверх
drug007
Дата 15.1.2015, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(baldina @  14.1.2015,  23:03 Найти цитируемый пост)
если вы поймали исключение (равно как и сработал assert), то крах еще только собирается. дальше все зависит от логики вашего приложения. например в хроме сбой на одной закладке не влияет на другие.

Вот это принципиальный момент. Я исхожу из того, что есть ошибки и есть баги, скажем так. Если в функцию, которая делит на ноль, передается аргумент ноль - это ошибка, ее можно избежать предварительной проверкой аргументов. И если мы передадим другой аргумент, отличный от нуля все будет работать. А вот если в эту функцию передали верное число, но тем не менее в ходе ее выполнения делитель становится равным нулю - это баг в логике фукнции, исправить баг можно только переписыванием кода и нет никакой гарантии что в следующий вызов с другими аргументами вернет корректный результат. В случае ошибки к моменту выбрасывания исключения краха нет, а в случае бага крах  уже произошел. Я как раз речь веду о второй ситуации.
PM MAIL   Вверх
konshyn
Дата 15.1.2015, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(drug007 @  15.1.2015,  15:03 Найти цитируемый пост)
Я как раз речь веду о второй ситуации. 

Я так понимаю, вы хотите разработать систему оповещения, которая отслеживает Ваши же баги?



--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
drug007
Дата 15.1.2015, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(konshyn @  15.1.2015,  15:59 Найти цитируемый пост)
Я так понимаю, вы хотите разработать систему оповещения, которая отслеживает Ваши же баги?

 smile  звучит как-то не так, не уверен, что это можно так назвать  smile 
У меня есть некий код:
Код

int x;

auto y = foo(x);
auto z = bar(x);


При этом по логике я точно знаю, что x никогда не должна быть больше 1000, если y > 500. Тогда я добавляю ассерт:
Код

int x;

auto y = foo(x);
auto z = bar(x);
assert(x<= 1000 && y > 500 || y <= 500);

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

Это сообщение отредактировал(а) drug007 - 15.1.2015, 16:46
PM MAIL   Вверх
konshyn
Дата 15.1.2015, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(drug007 @  15.1.2015,  16:36 Найти цитируемый пост)
если вдруг переменая x приняла недопустимое значение, значит была нарушена логика приложения и гарантировать корректное его состояния невозможно, поэтому я падаю в ассерте. 

Значит я правильно понял: Вам нужна система оповещения Ваших же багов и, если возможно, их устранение. 
ИИ Вам в помощь.  smile 
Если серьезно - то, что Вы описали, - это ошибки программиста. И ассерты именно для этого и предназначены, чтобы в разрабатываемом коде отслеживать ошибки логики. Оставлять их на продакшене не нужно, как по мне. Исключения помогают оповестить пользователя об ошибке, этого достаточо. Если есть подозрение, что это, например, ошибка логики, то можно пропустить выполнение какой-нибудь функции и попровать снова, когда она снова будет вызвана - конечно, если это все некритично. Все ошибки логики должны находиться во время тестирования. Если приложение ОЧЕНЬ критическое, как, например, авиационное/медицинское/т.д., то тестировать нужно очень тщательно и кропотливо.

Добавлено через 7 минут и 22 секунды
И опять же, зависит от ситуации: если произошел сбой логики в системе торможения автомобиля, то лучше как можно быстрее попробовать снова затормозить, чем "оповестить" пользователя.
А если это, к примеру, медицинское оборудование (ссылка на сбой ПО ренгеновского аппарата), то лучше закончить работу и оповестить пользователя, если это возможно - понять, что произошла ошибка.

Добавлено через 7 минут и 55 секунд
И в первом и во втором случаях ПО должно работать все время.

Добавлено через 12 минут и 31 секунду
Из ссылки какие методы были применены:
Цитата

Ошибки дозиметрии стали считаться фатальными (после них система перезагружается).
Добавлена мгновенно перезапускающая систему программная ветвь и делающая то же самое независимая аппаратная цепь.
Исправлены все найденные ошибки; добавлена перестраховка.
Непонятные сообщения об ошибках заменены осмысленными.



--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
drug007
Дата 16.1.2015, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



я наверное, неясно излагаю. речь идет о том, что после отладки мы в релизе убираем ассерты/контракты/инварианты/прочая из кода. потому что считается, что мы все отладили. но на самом деле никто не может гарантировать этого. а значит если будет обнаружен баг при эксплуатации, то в релизе его выловить будет намного сложнее, потому что все диагностические средства мы отключили. вот и вопрос - где золотая середина, что нужно все-таки оставлять в релизе, а что нет. При чем здесь система оповещения о багах, какой ИИ?

konshyn, за ссылку спасибо, полезная штука - есть некоторые рекомендации и их наглядное обоснование.

Это сообщение отредактировал(а) drug007 - 16.1.2015, 12:19
PM MAIL   Вверх
konshyn
Дата 16.1.2015, 14:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(drug007 @  16.1.2015,  10:56 Найти цитируемый пост)
я наверное, неясно излагаю. речь идет о том, что после отладки мы в релизе убираем ассерты/контракты/инварианты/прочая из кода. потому что считается, что мы все отладили.

Так необязательно убирать. для этого, например, можно вести отдельный log-файл. Если всяческие проверки не критичны (скорость, размер кода и т.п.), то просто проверять те места, где были ассерты, и если что-то произошло, то бишь ошибка логики, то вывести всю нужную информацию в этот log-файл="для своих нужд", оповестить пользователя или систему об этом и завершить работу.

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

Добавлено через 41 секунду
Я понимаю, что Вы хотите сказать. Но мне кажется, что Вы ждете ответа, которого, возможно, и нет (пока что).


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
drug007
Дата 16.1.2015, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(konshyn @ 16.1.2015,  14:07)
Так необязательно убирать. для этого, например, можно вести отдельный log-файл. Если всяческие проверки не критичны (скорость, размер кода и т.п.), то просто проверять те места, где были ассерты, и если что-то произошло, то бишь ошибка логики, то вывести всю нужную информацию в этот log-файл="для своих нужд", оповестить пользователя или систему об этом и завершить работу.

Вот у меня такие же мысли

Цитата(konshyn @ 16.1.2015,  14:07)

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

И тут тоже  smile 

Цитата(konshyn @ 16.1.2015,  14:07)

Я понимаю, что Вы хотите сказать. Но мне кажется, что Вы ждете ответа, которого, возможно, и нет (пока что).

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

Это сообщение отредактировал(а) drug007 - 16.1.2015, 14:44
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.