Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Ошибка сегментации  (Прочитано 1566 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн miksayer

  • Автор темы
  • Любитель
  • *
  • Сообщений: 59
    • Просмотр профиля
Ошибка сегментации
« : 13 Мая 2010, 21:57:11 »
Через некоторое время(при чем вроде как постоянное) после работы программа падает и выдает ошибку сегментации. Как посоветуете отловить ее с помощью gdb? Просто насколько я помню IDE  со встроенным gdb умеют показывать строку, на которой произошла такая ошибка. Но я пишу в обычном gedit'е и приходится делать все руками.

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Ошибка сегментации
« Ответ #1 : 14 Мая 2010, 00:00:09 »
Скомпилируй свой код с ключём -ggdb запусти его в gdb дождись segmentation fault и введи команду bt (back trace) он тебе и в консоли номер строки ошибки показать сможет.

У GDB есть некоторое количество GUI (не говоря уже о том, что любая IDE в линуксе умеет с ним работать). Ты можешь выбрать любой и работать с ним. Я сам немного работал с KDbg. Есть официальный фронтэнд DDD.

Всё таки чисто консольный отладчик это слишком сурово. Хотя, для выпендрежа, его можно на элементарном уровне выучить.

Оффлайн miksayer

  • Автор темы
  • Любитель
  • *
  • Сообщений: 59
    • Просмотр профиля
Re: Ошибка сегментации
« Ответ #2 : 14 Мая 2010, 14:33:35 »
спасибо

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Ошибка сегментации
« Ответ #3 : 14 Мая 2010, 18:00:07 »
Либо post-mortem debugging.

1. Компилируем программу с ключом -ggdb3
2. $ ulimit -c unlimitedЭта команда снимет лимит на размер создаваемых ядерных файлов (core.###, где ### - PID обвалившегося процесса), который по умолчанию 0 (не создавать)
3. $ gdb исполняемый_файл --core=тот_самый_core
Далее с помощью команд дебагера
bt
show threads, если программа многопоточная
t #, где # - номер потока
и снова bt
изучаем стеки потоков.
Поток, в котором произошла ошибка, будет, вероятнее всего, первым.
С помощью команды print можно посмотреть значения переменных.
Если в программе есть контейнеры STL, надо поискать скриптики для GDB, которые позволят поглядеть их в боле-мене вменяемом виде.

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

Помимо gdb есть valgrind - ну очень полезный отладчик.
« Последнее редактирование: 14 Мая 2010, 18:02:11 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Ошибка сегментации
« Ответ #4 : 15 Мая 2010, 13:14:40 »
совершенно верно, valgrind - это то, что нужно в данной ситуации.....

Откомпилируй с отладочной информацией, запусти через valgrind и смотри "последний путь" программы....

 

Страница сгенерирована за 0.091 секунд. Запросов: 25.