Так уж случилось, что по долгу работы очень много времени провожу с операционными системами семейства GNU/Linux. Основным видом моей деятельности является разработка программного обеспечения на С++.
Так вот, основной проблемой при использовании отладчика – это отображение сложных контейнеров, например, stl-контейнеров.
Решение, которое я предлагаю, актуально для gdb. Этот отладчик поддерживает скрипты, написанные на языке python, а механизмы отображения сложных объектов, называются pretty printers. Т.е. чтобы отладчик отображал нам все правильно, необходимо указать ему где находятся скрипты с этими самыми pretty printers. Для указания отладчику дополнительных команд необходим файл .gdbinit.
Итак, попробую оформить все, как инструкцию, так и читать удобней, и сам не забуду.
1. Установить gcc, g++, gdb, libstdc++-dbg, последнее очень важно, т.к. в свежих дистрибутивах именно с отладочными символами происходит установка скриптов с pretty printers, например, в Ubuntu 14.04 появляется директория /usr/share/gcc-4.8/python/libstdcxx.
2. Создать в домашней директории файл .gdbinit со следующим содержимым:
#
# .gdbinit : GDB Config file
#
# add python pretty printers for STL
python
import sys
sys.path.insert(0, '/usr/share/gcc-4.8/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
set auto-load local-gdbinit on
set print pretty on
set print object on
set print static-members on
set print vtbl on
set print demangle on
set demangle-style gnu-v3
set print sevenbit-strings off
Вроде все хорошо, но есть проблема, в последних версиях GNU/Linux, gdb собирают с поддержкой python версии 3.*, а по умолчанию установлен python версии 2.*. Чтобы устранить эту проблему, т.е. сделать скрипты с поддержкой обеих версий python есть патч, можно найти его на просторах сети, можно взять тут: _https://www.dropbox.com/s/ef265fbo00yk1x8/libstdcpp.patch. Изменениям подлежит файл /usr/share/gcc-4.8/python/libstdcxx/v6/printers.py
И снова, вроде все хорошо, но опять есть проблема, на некоторых дистрибутивах не устанавливаются те самые скрипты с pretty printers. Для этого есть svn репозиторий _svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python. Вот ссылка с дополнительным описанием: _http://sourceware.org/gdb/wiki/STLSupport. Если это Ваш случай, то, после выгрузки репозитория, не забудьте в файл .gdbinit изменить путь до скачанных скриптов.
3. При сборке проекта с отладкой не забудьте указать флаг _GLIBCXX_DEBUG. Это необходимо, чтобы правильно отображались такие контейнеры, как stringstream.
В заключение, хочу сказать, что «пляски» с pretty printers (второй пункт) не нужны, если вы используете в качестве IDE QtCreator, т.к. эта IDE использует свои скрипты для взаимодействия с gdb.
Автор: raiSadam