Отладка C++ программ в ОС GNU/Linux

Так уж случилось, что по долгу работы очень много времени провожу с операционными системами семейства 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.
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 10

    +7
    Вроде все хорошо, но есть проблема, в последних версиях GNU/Linux, gdb собирают с поддержкой python версии 3.*, а по умолчанию установлен python версии 2.*. Чтобы устранить эту проблему, т.е. сделать скрипты с поддержкой обеих версий python есть патч, ...

    Может я что-то не понимаю, но зачем что-то патчить, если можно просто доставить python3?
      0
      Можно, только, в случае с патчингом можно пользоваться любой, установленной по-умолчанию, версией python в системе. Мало ли у кого какие ограничения.
      • UFO just landed and posted this here
        +18
        Так как все таки отлаживать С++ программы в gdb? :) Из текста статьи нифига ведь непонятно…
          +1
          Ну, должна же сохранятся какая-то интрига! :)
          0
          Кстати способ взлетит и в windows под mingw.
          Файл .gdbinit кладётся в домашний каталог пользователя (для свежих версий винды C:\Users\)
          В строке sys.path.insert(0, '/usr/share/gcc-4.8/python') пишется абсолютный путь для текущей версии mingw, например sys.path.insert(0, 'C:\MinGW\share\gcc-4.8.1\python').
          В самом MinGW вместо mingw32-gdb ставится mingw32-gdb-python. Требует питона 2.7.
          Соответственно отладчик становится не gdb а gdb-python27.

          Если используется CodeBlock — необходимо дополнительное шаманство wiki.codeblocks.org/index.php?title=Pretty_Printers

          Наличие собственных скриптов характерно не только для QT. Вон в CodeBlock тоже свои скрипты. Благополучно отвалились, после обновления MinGW до версии компилятора свежее, чем в сборке CodeBlock.

          Спасибо за статью. Если бы не она — так и не полез бы разбираться, почему в CodeBlock строки криво отображаются :)
            0
            А расскажите, если вы пользуетесь gdb под MinGW: правда же, что никаким образом нельзя заставить работать конструкцию «run <input.txt >output.txt»? А то каждый раз, когда мне приходилось что-то собирать и дебажить из-под MinGW-шного окружения, эта проблема доводила до белого каления =/
              0
              Не знаю. У меня MinGW стоит для компиляторов. Разработку и отладку я веду в средах разработки.
            0
            А как эти pretty printers можно писать для своих типов данных и можно ли их потом цеплять автоматом из qt creator например?
              +2
              Tools → Options → Debugger → GDB (tab) → General (section) → Load .gdbinit file on startup + Load system GDB pretty printers.

            Only users with full accounts can post comments. Log in, please.