![]() |
|
Модераторы: xvr |
![]()
|
|
| Anton Vatchenko |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 21.5.2004 Репутация: -1 Всего: -1 |
В джаве было удобно обрабатывать любую ошибку с помощью экзепшнов... В си под линухом я так понял нельзя... Можно либо как-то обработать этот SegFault, либо перед ним (я знаю где он вываливается) вызвать Stack Trace вызывающих функций?
|
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Можно: man signal & sigaction
|
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
нет, не только GDB - это такая же программа, как и другие будут проблемы с возобновлением дальнейшей работы программы обработка SIGSEGV нужна разве что для корректного освобождения ресурсов -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Для того, что бы получить Stack Trace нужен порядочный кусок gdb. Я не спорю, что этот кусок можно написать самому, или выдрать из gdb, но получить его (Stack Trace) одним вызовом чего-нибудь из libc не получится.
|
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
не помогут, т. к при их использовании потеряем стек -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| prof_GCC |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 21.2.2008 Репутация: нет Всего: нет |
А зачем автору отлавливать ошибку сегментирования, это глупость, все остальные сигналы прекрасно обрабатываются, а если у тебя в программе возникает такая ошибка, то совет один gdb, и внимательность при написании кода
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
для освобождения занятых ресурсов и логирования Это сообщение отредактировал(а) MAKCim - 1.3.2008, 10:03 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Мы его уже практически потеряли при SEGV - продолжить исполнение на этом стеке (без плясок с бубном) уже нельзя Единственный способ продолжить (IMHO) - разобраться с инструкцией, вызвавшей SEGV, откорректировать ей регистры/память и повторить, или выполнить самому ее семантику без SEGV и продолжить исполнение со следующей инструкции. И почему то мне кажется, что если автор темы в состоянии это сделать, он бы таких вопросов не задавал И еще мне кажется, что у него банальные проблемы с отладкой |
|||
|
||||
| prof_GCC |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 21.2.2008 Репутация: нет Всего: нет |
отладка отладка и еще раз отладка, ошибку сегментирования ловить не нужно если она возникает, то как минимум надо устранить причину, а не пытаться ее обработать, а для этого есть gdb
|
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
xvr,
я согласен, но setjmp() и longjmp() тут не помогут если получил управление наш обработчик SIGSEGV, то в сигнальном фрейме были сохранены значения всех регистров, которые они имели до SIGSEGV так что нужно использовать этот фрейм, а не longjmp()
можно если управление получил наш обработчик, то со стеком все в порядке Добавлено через 4 минуты и 33 секунды
нужно в сложной программе все предусмотреть нельзя, также нельзя доказать ее безошибочность SIGSEGV может проявиться не сразу, а до этого программа может работать абсолютно правильно может открывать соединения с БД и т. д при ошибке необходимо как минимум корректно освободить все ресурсы и залогировать все, что можно дальше, конечно, отладка и поиск ошибки (по дампу и логам) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
При вызове обработчика SEGV будет сформирован специальный фрейм на верхушке пользовательского стека. Если теперь вызвать из обработчика SEGV longjmp с фреймом ВНУТРИ текущего пользовательского стека, то весь стек (включая сформированный системой для обработчика SEGV) будет свернут и исполнение продолжено после setjmp.
|
||||||
|
|||||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
setjmp() сохраняет текущий контекст (в момент вызова) появление же SIGSEGV асинхронно по отношению к основному потоку выполнения после setjmp(), но перед SIGSEGV может идти активная работа со стеком после выполнения longjmp() мы эту часть стека просто потеряем
в этом смысле да, адрес возврата будет либо адресом инструкции, которая вызвала исключение, либо адрес функции окружения (если задан флаг SA_RESTORER) я же имел в виду, что со стеком как с областью адресного пространства будет все в порядке
оно и не требуется (в смысле продолжение работы) здесь важно освободить все ресурсы и залогировать как можно больше информации также лучше сохранить дамп стека для последующей отладки а его мы не сможем получить через longjmp() по вышеназванным причинам -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| xvr |
|
||||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Разумеется setjmp/longjmp не панацея и требуют определенного протокола при работе с ними для отлова SEGV. Например, у нас есть plugin, выполненный в виде .so, и мы хотим, что бы падение в процедурах этого plugin'а не приводило к падениям нашего приложения. В таком случае мы можем устанавливать обработчик SEGV и вызывать setjmp перед вызовами процедур из plugin'а, и сбрасывать обработчик после вызовов. В случае получения SEGV ВНУТРИ процедуры plugin'а, мы можем сделать longjmp, после чего матерно обругаться и выгрузить plugin. Разумеется, одного вызова setjmp в начале программы, а потом переход по longjmp в SEGV не достаточно
|
||||||||||||||
|
|||||||||||||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
зачем велосипеды изобретать? вводить какие-то протоколы, если нужную информацию можно просто получить из сигнального фрейма в большинстве случаев да (если не надо анализировать соответствующую инструкцию) вообще, что-то не понятно, о чем мы спорим я утверждаю, что setjmp()/longjmp() не лучшее решение, если нужно нечто бОльшее, нежели обычное завершение процесса, при получении SIGSEGV про abort(), пожалуй, соглашусь -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Хочется не просто получить информацию, а изолировать неработоспособный кусок кода и продолжить исполнение дальше.
|
||||||
|
|||||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |