PIP 6.2.0
Platform-Independent Primitives
Загрузка...
Поиск...
Не найдено
Отладка в GDB

Вместе с PIP поставляется скрипт pretty-printer'ов для GDB, tools/gdb/pip_pp.py, который выводит содержимое базовых типов вместо их внутренних полей:

Тип Пример вывода
PIString "hello"
PIByteArray {0x48, 0x65, 0x6c, 0x6c, 0x6f}
PIChar 'a' или U+043c
PIVector<T> {1, 2, 3}
PIDeque<T> {1, 2, 3}
PIStringList {"one", "two"}
PIMap<K,V> {"x": 1, "y": 2}
PISet<T> {3, 5}
PIPair<K,V> {"k", 7}
PIVariant PIVariant(pivInt, 4 bytes)
PINetworkAddress 192.168.1.10:8080

Вложенные контейнеры выводятся рекурсивно, например PIVector<PIString> выводится как {"a", "bb"}. Указатели на поддерживаемые типы показывают адрес и содержимое: (PIString *) 0x7fffffffdac0 "hello".

Принтеры только читают память и защищены от ошибок: при любом сбое GDB возвращается к стандартному (сырому) выводу. Длинные контейнеры обрезаются, по умолчанию выводится первые 32 элемента (хвост показывается как ..., ... (N total)); ограничение задаётся константой _MAX_ELEMENTS в начале файла pip_pp.py.

Требование: исполняемый файл и библиотека PIP должны быть собраны с отладочной информацией (-g).

Загрузка принтеров

Вручную (работает с любым деревом сборки):

(gdb) source /path/to/pip/tools/gdb/pip_pp.py

Выполнять после загрузки исполняемого файла (в сессии, запущенной как gdb ./program, или после команды file).

Автоматически: CMake install ставит скрипт в <prefix>/share/pip/gdb/pip_pp.py и auto-load заглушку <prefix>/lib/libpip.so-gdb.py рядом с библиотекой. GDB выполняет заглушку автоматически при загрузке libpip.so (см. руководство GDB, "Auto-loading extensions"). Если библиотека установлена вне стандартного auto-load safe path GDB, добавьте каталог один раз:

(gdb) add-auto-load-safe-path /your/prefix/lib

Или создайте <homedir>/.gdbinit файл и запишите туда строку

add-auto-load-safe-path <root_dir>

, где root_dir - это корневая директория, в рамках которой находятся библиотека и скрипт pip_pp.py.

Заглушка устанавливается только для shared-сборок; для статических сборок используйте ручной source.

Qt Creator

Окна Variables/Expressions в Qt Creator не используют pretty-printer'ы GDB — у них собственный Python-дампер. PIP предоставляет модуль дампера tools/qtcreator/pip_types.py, который покрывает те же типы, что и pip_pp.py. Для включения:

  1. Откройте настройки отладчика (Qt Creator -> Настройки -> Отладчик).
  2. Переключитесь на вкладку «Переменные и выражения».
  3. В поле "Extra Debugging Helper" укажите путь к файлу:
/path/to/pip/tools/qtcreator/pip_types.py

После этого PIString, PIVector<T>, PIMap<K,V> и другие типы из таблицы выше будут показывать своё содержимое в окнах «Переменные» и «Выражения». Изменения в настройках GDB (.gdbinit, auto-load заглушка) для Qt Creator не нужны; они продолжают работать для GDB из командной строки.

Проверка установки

Скрипт проверки собирает демо со всеми поддерживаемыми типами и сверяет ожидаемый вывод GDB:

tools/gdb/test/test_pp.sh build_linux