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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка segmentation fault либо хоть Stack Trace 
:(
    Опции темы
Anton Vatchenko
Дата 29.2.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В джаве было удобно обрабатывать любую ошибку с помощью экзепшнов... В си под линухом я так понял нельзя... Можно либо как-то обработать этот SegFault, либо перед ним (я знаю где он вываливается) вызвать Stack Trace вызывающих функций?


--------------------
user posted image
PM MAIL   Вверх
xvr
Дата 29.2.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Anton Vatchenko @ 29.2.2008,  13:40)
В джаве было удобно обрабатывать любую ошибку с помощью экзепшнов... В си под линухом я так понял нельзя... Можно либо как-то обработать этот SegFault, 

Можно: man signal & sigaction

Цитата

либо перед ним (я знаю где он вываливается) вызвать Stack Trace вызывающих функций?
Только в gdb

PM MAIL   Вверх
MAKCim
Дата 29.2.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(xvr @  29.2.2008,  13:57 Найти цитируемый пост)
Только в gdb

нет, не только
GDB - это такая же программа, как и другие
Цитата(xvr @  29.2.2008,  13:57 Найти цитируемый пост)
Можно: man signal & sigaction

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



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
xvr
Дата 29.2.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(MAKCim @ 29.2.2008,  16:44)
Цитата(xvr @  29.2.2008,  13:57 Найти цитируемый пост)
Только в gdb

нет, не только
GDB - это такая же программа, как и другие

Для того, что бы получить Stack Trace нужен порядочный кусок gdb. Я не спорю, что этот кусок можно написать самому, или выдрать из gdb, но получить его (Stack Trace) одним вызовом чего-нибудь из libc не получится.

Цитата

Цитата(xvr @  29.2.2008,  13:57 Найти цитируемый пост)
Можно: man signal & sigaction

будут проблемы с возобновлением дальнейшей работы программы
обработка SIGSEGV нужна разве что для корректного освобождения ресурсов
Я не очень понимаю, какая может быть 'дальнейшая работа' после SEGV  smile Если у автора темы есть представление о том, что он будет делать после SEGV, то setjmp/longjmp ему помогут  smile

PM MAIL   Вверх
MAKCim
Дата 1.3.2008, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(xvr @  29.2.2008,  20:19 Найти цитируемый пост)
Если у автора темы есть представление о том, что он будет делать после SEGV, то setjmp/longjmp ему помогут

не помогут, т. к при их использовании потеряем стек



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
prof_GCC
Дата 1.3.2008, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А зачем автору отлавливать ошибку сегментирования, это глупость, все остальные сигналы прекрасно обрабатываются, а если у тебя в программе возникает такая ошибка, то совет один gdb, и внимательность при написании кода smile

PM MAIL   Вверх
MAKCim
Дата 1.3.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(prof_GCC @  1.3.2008,  09:48 Найти цитируемый пост)
А зачем автору отлавливать ошибку сегментирования, это глупость

для освобождения занятых ресурсов и логирования

Это сообщение отредактировал(а) MAKCim - 1.3.2008, 10:03


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
xvr
Дата 1.3.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(MAKCim @ 1.3.2008,  00:27)
Цитата(xvr @  29.2.2008,  20:19 Найти цитируемый пост)
Если у автора темы есть представление о том, что он будет делать после SEGV, то setjmp/longjmp ему помогут

не помогут, т. к при их использовании потеряем стек

Мы его уже практически потеряли при SEGV - продолжить исполнение на этом стеке (без плясок с бубном) уже нельзя  smile
Единственный способ продолжить (IMHO) - разобраться с инструкцией, вызвавшей SEGV, откорректировать ей регистры/память и повторить, или выполнить самому ее семантику без SEGV и продолжить исполнение со следующей инструкции. И почему то мне кажется, что если автор темы в состоянии это сделать, он бы таких вопросов не задавал  smile 
И еще мне кажется, что у него банальные проблемы с отладкой  smile 
PM MAIL   Вверх
prof_GCC
Дата 1.3.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



отладка отладка и еще раз отладка, ошибку сегментирования ловить не нужно если она возникает, то как минимум надо устранить причину, а не пытаться ее обработать, а для этого есть gdb
PM MAIL   Вверх
MAKCim
Дата 1.3.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



xvr
я согласен, но setjmp() и longjmp() тут не помогут
если получил управление наш обработчик SIGSEGV, то в сигнальном фрейме были сохранены значения всех регистров, которые они имели до SIGSEGV
так что нужно использовать этот фрейм, а не longjmp()
Цитата(xvr @  1.3.2008,  10:09 Найти цитируемый пост)
при SEGV - продолжить исполнение на этом стеке (без плясок с бубном) уже нельзя

можно
если управление получил наш обработчик, то со стеком все в порядке

Добавлено через 4 минуты и 33 секунды
Цитата(prof_GCC @  1.3.2008,  10:36 Найти цитируемый пост)
ошибку сегментирования ловить не нужно если она возникает, то как минимум надо устранить причину

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
xvr
Дата 2.3.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(MAKCim @ 1.3.2008,  11:23)
xvr
я согласен, но setjmp() и longjmp() тут не помогут
если получил управление наш обработчик SIGSEGV, то в сигнальном фрейме были сохранены значения всех регистров, которые они имели до SIGSEGV
так что нужно использовать этот фрейм, а не longjmp()

При вызове обработчика SEGV будет сформирован специальный фрейм на верхушке пользовательского стека. Если теперь вызвать из обработчика SEGV longjmp с фреймом ВНУТРИ текущего пользовательского стека, то весь стек (включая сформированный системой для обработчика SEGV) будет свернут и исполнение продолжено после setjmp. 

Цитата

Цитата(xvr @  1.3.2008,  10:09 Найти цитируемый пост)
при SEGV - продолжить исполнение на этом стеке (без плясок с бубном) уже нельзя

можно
если управление получил наш обработчик, то со стеком все в порядке
А куда он будет возвращать управление? Там по прежнему команда, которая вызвала SEGV, и она его снова вызовет при возврате  smile Даже если откорректировать ip (а это уже и есть 'пляски с бубном'), что бы пропустить эту команду, то как минимум та часть семантики, которая была связанна с неудавшемся обращением в память обработанна не будет. Если мы предполагаем, что мы ничего не знаем о команде, вызвавшей SEGV, то поведение программы после этого становится явно неправильным  smile 

PM MAIL   Вверх
MAKCim
Дата 2.3.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(xvr @  2.3.2008,  11:12 Найти цитируемый пост)
При вызове обработчика SEGV будет сформирован специальный фрейм на верхушке пользовательского стека. Если теперь вызвать из обработчика SEGV longjmp с фреймом ВНУТРИ текущего пользовательского стека, то весь стек (включая сформированный системой для обработчика SEGV) будет свернут и исполнение продолжено после setjmp. 

setjmp() сохраняет текущий контекст (в момент вызова)
появление же SIGSEGV асинхронно по отношению к основному потоку выполнения
после setjmp(), но перед SIGSEGV может идти активная работа со стеком
после выполнения longjmp() мы эту часть стека просто потеряем
Цитата(xvr @  2.3.2008,  11:12 Найти цитируемый пост)
А куда он будет возвращать управление? Там по прежнему команда, которая вызвала SEGV, и она его снова вызовет при возврате

в этом смысле да, адрес возврата будет либо адресом инструкции, которая вызвала исключение, либо адрес функции окружения (если задан флаг SA_RESTORER)
я же имел в виду, что со стеком как с областью адресного пространства будет все в порядке
Цитата(xvr @  2.3.2008,  11:12 Найти цитируемый пост)
Если мы предполагаем, что мы ничего не знаем о команде, вызвавшей SEGV, то поведение программы после этого становится явно неправильным

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
xvr
Дата 2.3.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(MAKCim @ 2.3.2008,  11:38)
Цитата(xvr @  2.3.2008,  11:12 Найти цитируемый пост)
При вызове обработчика SEGV будет сформирован специальный фрейм на верхушке пользовательского стека. Если теперь вызвать из обработчика SEGV longjmp с фреймом ВНУТРИ текущего пользовательского стека, то весь стек (включая сформированный системой для обработчика SEGV) будет свернут и исполнение продолжено после setjmp. 

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

Разумеется setjmp/longjmp не панацея и требуют определенного протокола при работе с ними для отлова SEGV.
Например, у нас есть plugin, выполненный в виде .so, и мы хотим, что бы падение в процедурах этого plugin'а не приводило к падениям нашего приложения. В таком случае мы можем устанавливать обработчик SEGV и вызывать setjmp перед вызовами процедур из plugin'а, и сбрасывать обработчик после вызовов. В случае получения SEGV ВНУТРИ процедуры plugin'а, мы можем сделать longjmp, после чего матерно обругаться и выгрузить plugin.
Разумеется, одного вызова setjmp в начале программы, а потом переход по longjmp в SEGV не достаточно  smile 
Цитата

Цитата(xvr @  2.3.2008,  11:12 Найти цитируемый пост)
А куда он будет возвращать управление? Там по прежнему команда, которая вызвала SEGV, и она его снова вызовет при возврате

в этом смысле да, адрес возврата будет либо адресом инструкции, которая вызвала исключение, либо адрес функции окружения (если задан флаг SA_RESTORER)
Т.е. стек будет, но сделать с ним ничего нельзя - только смотреть  smile 
Цитата

я же имел в виду, что со стеком как с областью адресного пространства будет все в порядке
Если интересует стек 'как область адресного пространства', то можно сделать abort и потом (post-mortem) изучать полученный core до посинения  smile Я имел в виду 'стек вызовов', т.е. его 'живую' копию, на которой можно исполняться.

Цитата

Цитата(xvr @  2.3.2008,  11:12 Найти цитируемый пост)
Если мы предполагаем, что мы ничего не знаем о команде, вызвавшей SEGV, то поведение программы после этого становится явно неправильным

оно и не требуется (в смысле продолжение работы)
здесь важно освободить все ресурсы и залогировать как можно больше информации
также лучше сохранить дамп стека для последующей отладки
а его мы не сможем получить через longjmp() по вышеназванным причинам
Здесь надо различать, что же мы хотим получить по SEGV - продолжение работы (вариант с setjmp/longjmp) или аварийное завершение, а затем отладку и разбор полетов - в таком случае abort

PM MAIL   Вверх
MAKCim
Дата 3.3.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(xvr @  2.3.2008,  19:33 Найти цитируемый пост)
Разумеется setjmp/longjmp не панацея и требуют определенного протокола при работе с ними для отлова SEGV.

зачем велосипеды изобретать?
вводить какие-то протоколы, если нужную информацию можно просто получить из сигнального фрейма
Цитата(xvr @  2.3.2008,  19:33 Найти цитируемый пост)
Т.е. стек будет, но сделать с ним ничего нельзя - только смотреть

в большинстве случаев да (если не надо анализировать соответствующую инструкцию)

вообще, что-то не понятно, о чем мы спорим
я утверждаю, что setjmp()/longjmp() не лучшее решение, если нужно нечто бОльшее, нежели обычное завершение процесса, при получении SIGSEGV
про abort(), пожалуй, соглашусь


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
xvr
Дата 3.3.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(MAKCim @ 3.3.2008,  10:34)
Цитата(xvr @  2.3.2008,  19:33 Найти цитируемый пост)
Разумеется setjmp/longjmp не панацея и требуют определенного протокола при работе с ними для отлова SEGV.

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

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

Цитата

вообще, что-то не понятно, о чем мы спорим
я утверждаю, что setjmp()/longjmp() не лучшее решение, если нужно нечто бОльшее, нежели обычное завершение процесса, при получении SIGSEGV
Собственно об этом и спорим smile Вопрос о том, что такое 'нечто бОльшее', тут возможны варианты:
  •  Корректно завершить работу приложения, сохранить стек для посмертного разбора полетов в gdb. - Тут setjmp/longjmp не нужны, нужен abort
  •  Изолировать сбойный участок приложения (plugin), сохранить стек сбоя для анализа в gdb, отключить участок кода, продолжить исполнение. setjmp/longjmp + функция для сброса core файла (если она есть smile ) 
  •  Что такое gdb? - man gdb на ночь до полного просветления  smile

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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