LINUX.ORG.RU

В Linux нет аналога SEH. Можно отловить сегфолт через signal(SIGSEGV), а уже из обработчика кинуть плюсовое исключение.

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

и как этот «handle SIGSEGV ignore в GDB» сделать?

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

Если тебе надо ловить сегфолт через исключение, то, скорее всего, ты что-то абсолютнейшим образом делаешь неправильно.

nikolnik ★★★
()

1) GDB
2) Valgrind
3) Strace
4) fprintf(stderr, «Я не лох, Торвальдс тоже принтами советует дебажить код»);

ujas-iz-glubin
()

segmentation fault моя самая любимая ошибка, ее ловить очень просто - логами и\или коркой
хуже если не падает и работает иногда плохо - вот тут можно и день потратить, а найти потом какойто забытый if )

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

Особенно хорошо ловить коркой наведенный сегфолт, когда кто то проехалтся по заголовку std::vector а потом ты в него через хрен знает сколько инструкций полез и оно уппало. И смотришь такой на gdb указывающего в потроха stl в полном недоумении...

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

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

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

Маленькие радости плюсового программиста. Я, с тех пор как на Rust перешёл, ловлю сегфолты только во внутренностях графических драйверов (написанных на C++, надо полагать).

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

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

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

А нет, глянул перегрузку операций в обобщенных типах (так чтоли оно у них, ну аналог шаблонов, типажи растовские) - разонравилось. Слишком много букв;-)

https://habrahabr.ru/post/262235/

Правда там какие то макросы есть продвинутые с регэкспами...

AIv ★★★★★
()
Последнее исправление: AIv (всего исправлений: 2)
Ответ на: комментарий от tailgunner

Ну gdb я не так часто пользуюсь.

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

В синстаксисе? Но это субъективно.

Еще одна проблема - как раст дружит с кудой? Плюсовый код (без извращений) переносится почти 1:1.

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

Можно отловить сегфолт через signal(SIGSEGV), а уже из обработчика кинуть плюсовое исключение.

Можешь подробнее расписать. Потому что я не догоняю, как обработчик исключения, выброшенного из обработчика сигнала, догадается откуда на самом деле его хотели выбросить (из того участка кода, который привел к SIGSEGV). Ведь для обработки исключения нужен правильный EIP и ESP.

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

уже из обработчика кинуть плюсовое исключение.

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

Никак. Можно заюзать sigaction и внутри обработчика раскрутить стектрейс.

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

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

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

В этом треде о Rust начал говорить не я.

Она могла быть убедительнее

Меня устраивает уровень ее убедительности.

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

а уже из обработчика кинуть плюсовое исключение

Нельзя. Компилятор не ожидает исключение на каждой инструкции, а только после throw и вызовов функций (если они не помечены noexcept). Поэтому брошенное таким методом исключение может привести к новому segfault или std::terminate :)

Если в C++ процессе произошел SIGSEGV, то единственное что можно безопасно сделать - диагностику (стектрейс и т.п) и завершение процесса. Корректно восстановиться в общем случае нельзя.

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