LINUX.ORG.RU

Секреты создания неубиваемых программ на C++

 ,


0

3

Хочется чтобы исключения c++, а также run-time исключения типа SEGFAULT и прочие не приводили к завершению работы программы.
Какие хуки, хаки, архитектурные извороты и прочие хитрости кто использует?
Как оно в продакшне, работает успешно?



Последнее исправление: nerdogeek (всего исправлений: 1)

run-time исключения типа SEGFAULT и прочие не приводили к завершению работы

Рано тебе на Си++ писать. Попробуй Яву.

tailgunner ★★★★★
()

Разбить программу на процессы,т.е. как минимум 3 разных процесса,каждый из которых контролирует работу двух других.

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

В целом то что ты хочешь,и без потоков-реализовано на java и .net,и других интерпретируемых языках(питон и прочие).

anonymous
()
Ответ на: комментарий от tailgunner

Почемуй-то? Не, яву не люблю. Люблю темплейты, эксэпшны в деструкторах, велосипеды и прочие бусты.
Так что давайте конструктивненько тут.

nerdogeek
() автор топика
Ответ на: комментарий от nerdogeek

Так что давайте конструктивненько тут.

1) если в программе возник сегфолт, есть нехилая вероятность, что ее внутренние струкутры данных разрушены и попытка продолжения работы бессмысленна или опасна

2) если ты этого не понимаешь, тебе не следует писать на Си++

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Разбить программу на процессы,т.е. как минимум 3 разных процесса,каждый из которых контролирует работу двух других.

что за такой феерический бред? разделение на процессы нужно для увелечения производительности в сочетании с разделением полномочий. а не для контроля процессов друг над другом.

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

ох не приведи Торвальдс такую программу повидать!

anonymous
()
Ответ на: комментарий от tailgunner

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

nerdogeek
() автор топика

Ненавижу программы, которые вместо того чтобы сегфолтнуться, как положено, перехватывают сигнал и сами вываливают «отладочные данные». Или хуже того — продолжают дальше работать. А может я её в отладчик хотел запихнуть? И что мне теперь делать?

i-rinat ★★★★★
()
Ответ на: комментарий от nerdogeek

А если у меня есть алгоритм проверки целостности для важных структур данных?

Ну, проверь данные в списке с битыми линками.

Хэш-суммы, бэкап данных в файлах и прочие методы?

По-моему, ты не понимаешь, о чем говоришь.

Затем можно рестартовать ту часть системы, которая грохнулась и которая не критична как сами данные.

Можно. Но не теми методами, о которых ты спрашивал.

tailgunner ★★★★★
()

лучше найти причину сегфолта и исправить, вместо того, чтобы ерундой заниматься

Harald ★★★★★
()
Ответ на: комментарий от anonymous

разделение на процессы нужно для увелечения производительности

фигасе, кто бы мог подумать :)

Harald ★★★★★
()

а вообще можно в обработчике сегфолта новый экземпляр программы запускать и завершаться. В надежде, что он на этот раз не засегфолтится :)

Harald ★★★★★
()
Ответ на: комментарий от wota

закомментарить одну строчку и пересобрать // К.О.

Её ещё найти надо. А с местом сегфолта всё просто — где взглючило, оттуда и копай.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от anonymous

что за такой феерический бред?

Ага,читаю и непойму,чтож за бред ты написал.

разделение на процессы нужно для увелечения производительности в сочетании с разделением полномочий. а не для контроля процессов друг над другом.

Конечно,а автомобили нужны только чтоб возить людей,когда автомобиль везет другой автомобиль-что за фееричный бред,какой идиот это придумал.

ох не приведи Торвальдс такую программу повидать!

Ты на такой «программе» прям щас,называется-движок лора,который по крону делает рестарт,а также перезапускается в случае падений.

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

anonymous
()
Ответ на: комментарий от Harald

а вообще можно в обработчике сегфолта новый экземпляр программы запускать и завершаться

Поздравляю, ты изобрел кривой вариант reexec.

tailgunner ★★★★★
()
Ответ на: комментарий от i-rinat

А может я её в отладчик хотел запихнуть? И что мне теперь делать?

Использовать ОТЛАДОЧНУЮ ВЕРСИЮ программы.

anonymous
()
Ответ на: комментарий от i-rinat

Её ещё найти надо.

просто погрепать по SIGSEGV - одна строка

wota ★★
()
Ответ на: комментарий от i-rinat

А с местом сегфолта всё просто — где взглючило, оттуда и копай.

не просто, надо сырцы, надо иметь на руках не стрипнутый бинарник с хотя бы g1 и без оптимизаций

wota ★★
()
Ответ на: комментарий от tailgunner

Еще можно 2 процесса использовать. 1й для хранения критических данных. 2й для их обработки. Через shmem взаимодействие, например. Изменения данных 2м процессом в 1й только если не было ошибок. 2й процесс если грохнется, то его рестартуем.

nerdogeek
() автор топика
Ответ на: комментарий от x4DA

VM-ке рестартовать незачем.

То есть, когда Erlang VM падает (а она падает при исчерпании памяти), ее растартовать незачем?

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Использовать ОТЛАДОЧНУЮ ВЕРСИЮ программы.

Ок, я её собрал. Но у меня она не падает. Она падает у другого человека. И очень редко. В связи с чем я бы не отказался от core dump'а.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

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

ilovewindows ★★★★★
()
Ответ на: комментарий от nerdogeek

Это уже другие методы и другая архитектура.

Через shmem взаимодействие, например

И снова фейл.

tailgunner ★★★★★
()
Ответ на: комментарий от ilovewindows

Каждому своё.

При невозможности старта программы тебе просто отрывают голову.

Выписывают премию, так как это даёт возможность «пойти навстречу клиенту» и «подогнать программу под его требования». :)

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Память щас дешевая и ее много.

Для таких редких сценариев встроенная функциональность рестарта особо не нужна.

x4DA ★★★★★
()
Ответ на: комментарий от ilovewindows

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

Если программа засегфолтилась при старте, что мешает ей засегфолтиться при следующем старте?

Чем ситуация, когда программа 1 раз запустилась и упала, лучше постоянно перезапускающейся и тут же падающей программы?

Harald ★★★★★
()
Ответ на: комментарий от Harald

Если программа засегфолтилась при старте, что мешает ей засегфолтиться при следующем старте?

А что ей мешает стартовать нормально?

Чем ситуация, когда программа 1 раз запустилась и упала, лучше постоянно перезапускающейся и тут же падающей программы?

Могу объяснить, чем ситуация, когда перезапущенная программа работает, лучше, чем ситуация когда программа падает навсегда.

tailgunner ★★★★★
()
Ответ на: комментарий от i-rinat

Ну да, если конторы большие и еще лучше государственные, тогда можно мозг выносить «пойти навстречу клиенту». Можно даже создать специальную службу тех. поддержки с девицами, которые эту программу в глаза не видели.

ilovewindows ★★★★★
()
Ответ на: комментарий от Harald

1.Например считала битый пакет из сети, отбросила его и дальше работает.
2.Ничем, речь о том что перехватывающая ошибки программа лучше падающей.

ilovewindows ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Разговор не об этом...

И об этом тоже.

ОК, _я_ говорю не об этом.

Грош цена «объектному» языку, который понятия не имеет об исключительных ситуациях.

WAT. В Си++ есть исключения.

tailgunner ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

тамошние исключения просто сказка!

угу, там где в C++ просто отрабатывает RAII - в Java «сказочники» копипастят код в finally

wota ★★
()
Ответ на: комментарий от LongLiveUbuntu

Я о библиотеке классов исключений говорю, где она в С++?

http://www.cplusplus.com/reference/exception/exception http://www.cplusplus.com/reference/new/bad_alloc/

etc.

кстати в С++ можно любой класс и даже не класс бросить, а что Java? опять сосет?

wota ★★
()

run-time исключения типа SEGFAULT

Вот нафига? Максимум для напейсания программой завещания :)

slackwarrior ★★★★★
()
Ответ на: комментарий от wota

аналог кода

Привет застрявшим в 90-х...

Во первых-СТРУКТ-убейте свои структуры,структуры-признак Си-программ,т.е. НИЗКОУРОВНЕВЫЕ языки,где ОГРАНИЧЕНЫ ресурсы ПК.

Во вторых-код ПРИМИТИВЕН,до ужаса,на тойже джаве реализуется короче И ПОНЯТНЕЕ.

Вот скажите-чтоже в этом «коде»(по ссылке), по вашему, непереносимо?

Яже могу сказать что в примитивном Си неудобно-нечитаемый код,сотни,тысячи килобайт нечитаемого ненужного мусора.Плюс идиотизм с памятью.Все «большие» программы на Си выливаются в такой страшный ужас,которые только пилить и пилить с утра до вечера.
Именно поэтому глядя на ЗАДАЧУ-сократить времяпотери на проектирование программы и разработку-и ЛОГИЧНОЕ решение-сделать глобальную «машину» которая будет делать всю ту работу по контролю за памятью,отловом техже исключений,просто выполняя сценарий программы.

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

А ваш бред «ограничения джава»-ВСЕ современные языки программирования(включая джаваскрипт") позволяют реализовать ЛЮБУЮ логическую модель.И естественно и на Си и джаваскрипт и джава можно делать один и тотже АЛГОРИТМ.

Т.е. если вашего образования нехватает чтоб сделать АЛГОРИТМ,в каком-либо языке программирования-это проблема не языка,а ваша-вашей необразованности.Темболее что изучение синтаксиса языка занимает минуты...

Т.е. вы стоите в банальной позиции тупой блондинки-а пачиму у миня на кухне ручка с синенькой крапинкой дает синюю воду,а ТАМ только непонятный кран вообще биз ручки-нипорядок,вообще нипонятно как пользоваться,гдие синенькая ручка,дайте мние сининькую ручечку!!!!11111

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.