KDbg - Руководство Пользователя - Таблицы Типов
Author: Johannes Sixt

Содержание

# Таблица Типов KDbg

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

Таблицы типов KDbg расположены в каталоге `$KDEDIR/share/apps/kdbg/types`. Имена файло таблиц оканчиваются на `.kdbgtt`. Например, таблица типов для `libqt.so` называется `qt.kdbgtt`.

Файлы таблиц типов соответствуют стандартному синтаксису файлов конфигурации KDE. Файл содержит следующие группы:

- Группу `[Type Table]`, в которой перечислены типы и информация о том, как отладчик может определить, слинкована ли программа с этой библиотекой.
- Группу на каждый прописанный тип, в которой содержится информация о том, как KDbg должен отображать данный тип.

Для определения таблиц типов, применимых к отлаживаемой программе, KDbg запрашивает список разделяемых библиотек, с которыми слинкована программа. Затем он осуществляет поиск имен этих библиотек в таблицах типов в элементах `ShlibRE`. Используются те таблицы, в которых были найдены соответствующие имена библиотек. Если тип появляется в нескольких таблицах, то неопределено, какое же из описаний будет выбрано.

## Группа `[Type Table]`

Эта группа содержит следующие элементы:

- `Types1`, `Types2`, и тд. Эти элементы являются именами типов. Каждый из них представляет собой разделенный запятыми список имен типов. В каждом элементе может быть перечислено любое количество типов. (Имена типов можно разбить на несколько строк, чтобы они строки не получались слишком длинными.) В этих строках недопустимы символы пробела. Элементы должны нумероваться последовательно (KDbg прекращает чтение на первом же пропуске), однако элементы могут быть пусты (т.е. вообще не содержать типов). Иногда порядок перечисления имен имеет значение (см. пример с `Alias` ниже).
- `ShlibRE`. KDbg использует этот элемент для определения, использовать ли данную таблицу к текущей отлаживаемой программе. Для этого KDbg определяет разделяемые библиотеки, используемые программой. Если хотя бы одна из них совпадает со значением этого элемента, таблица используется. Используемые регулярные выражения совпадают с регулярными выражениями Qt (метасимволы `.*?[]^$\` распознаются обычным образом, однако отсутсвует возможность группировать символы.)
- `LibDisplayName`. Этот элемент используется в списках, в которых доступные таблицы типов перечислены для указания данной таблицы типов.
На данный момент это не используется.

## Группа типа

На каждый заявленый тип должна быть заведена группа, названная именем типа. На данный момент шаблоны С++ не поддерживаются. Каждая группа содержит следующие элементы:

- `Display` указывает, как KDbg должен отображать значение этого типа. Строка может содержать от 1 до 5 символов '`%`'. Они заменяются на результаты выражений, описанных в элементах `Expr`x.
- Один или более `Expr1`, `Expr2`, и тд. Каждый из них должен содержать только одну последовательность `%s`, которая будет заменена выражением, чье значение необходимо получить. Такие выражения передаются gdb, а результат заносится на место соответствующего символа процента в элементе `Display`.
- `Alias` указывает на тип-псевдоним. Если присутствует данная запись, то с данным типом обходятся также, как с тем, на который он указывает. Этот тип-псевдоним дожен быть описан перд ссылающимся на него типом в элементах `Types`x группы `[Type Table]`.

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

KDbg распознает специальное расширение, которое используется для вывода строк Qt 2.0 в unicode: Если перед `Expr`x стоит `/QString::Data`, подразумевается, что результат операции является указателем на `QString::Data`. Выводимое значение является строкой в unicode, представленное `QString::Data` (которое может быть `QString::null`, если это пустая строка Qt, или `(null)`, если `unicode` член структуры является нулевым указателем). Для примера см. `qt2.kdbgtt`.

Совет: Совсем необязательно описывать наследуемые типы, если они должны обрабатываться также как и базовый класс - KDbg может определить наследование и использовать описание типа первого (слева) базового класса. Вы можете использовать элемент `Alias` для быстрого указания класса при множественном наследовании, отличного от первого слева.

## Пример

Этот пример показывает, как `QString` и `QObject` описаны в `qt.kdbgtt`. Дополнительно определен `QTableView`, ссылающийся на `QObject`. Этот пример применим к Qt 1.x, который расположен в разделяемых библиотеках, имена которых оканчиваются как `libqt.so.1`.

    [Type Table]
    Types1=QString
    Types2=QObject,QTableView
    LibDisplayName=libqt 1.x
    ShlibRE=libqt\.so\.1$
    [QString]
    Display={ % }
    Expr1=(%s).shd->data
    [QObject]
    Display={ name=% #chld=% }
    Expr1=(%s).objname
    Expr2=(%s).childObjects->numNodes
    [QTableView]
    Alias=QObject

Замечание: гораздо безопаснее заключать `%s` в скобки.