2016-12-07 2 views
0

После компиляции программы на C++ с make и gcc во время работы возникла ошибка сегментации. Программа просто вышла без какого-либо сообщения об ошибке.Исследование ошибок сегментации и средств отладки

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

То, что я хотел бы знать:

  • Почему GDB отображает строку вызывает ошибку, но регулярные баш не?
  • Как gdb может отображать строку, когда программа не была скомпилирована в режиме отладки?
  • В прошлом я всегда перекомпилировался в режиме отладки (чтобы прикрепить символическую таблицу к двоичным файлам) и исследовал обратную линию основного дампа с помощью ddd. Является ли это подходящим способом для исправления ошибок сегментации или как это сделать?

ответ

1

Почему GDB отображает строку вызывает ошибку, но регулярные баш не?

Потому что gdb создан для этого. Ловушка segfault и сообщение об этом вам - часть его работы, чтобы помочь вам отлаживать. Например, вы можете получить обратную трассировку, изучить различные фреймы стека и т. Д., Чтобы определить природу и, возможно, причину ошибки. Баш не создан для этого, и такое поведение не предоставляется бесплатно.

Как gdb может отображать строку, когда программа не была скомпилирована в режиме отладки?

Очевидно, что какая-либо информация отладки вставлена ​​в двоичный файл по умолчанию, даже если вы его не запрашиваете. Достаточно, по крайней мере, предоставить номера строк для кода. Если вы используете GCC, то это может соответствовать -g1, тогда как -g эквивалентно -g2. Если вам интересно, вы можете скомпилировать с помощью -g0, чтобы узнать, удаляет ли это информацию о номере линии.

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

Не существует «надлежащего» здесь, кроме «независимо от того, что работает».

Я нахожу, что его легче отлаживать программы, скомпилированные с отключенной оптимизацией, и, конечно, отладочная информация наиболее полезна - при условии, что вы можете воспроизвести ошибку с таким двоичным кодом. Я также склонен заниматься valgrind всякий раз, когда я работаю над segfaults. Это также более информативно, когда доступна отладочная информация, и если есть проблема с памятью (которая почти неизменно указывает на segfault), то valgrind, скорее всего, идентифицирует ее, даже если отладочная версия программы не сбой. Что касается ddd, это всего лишь один из нескольких вариантов пользовательского интерфейса, включая собственные поддерживаемые инструменты. Используйте то, что работает для вас в этом отношении.

О, и в десятилетия программирования мне еще не приходилось прибегать к анализу основного дампа. Конечно, мое время может прийти, конечно, но я доволен отложить его.

Смежные вопросы