summaryrefslogtreecommitdiffstats
path: root/doc/ru/types.html
blob: 6cb8453c2ff7511def85bb5479bd2bb5549fd586 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=koi8-r">
   <meta name="Author" content="Johannes Sixt">
   <title>KDbg - Руководство Пользователя - Таблицы Типов</title>
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#0000EF" vlink="#51188E" alink="#FF0000">
<a href="index.html">Содержание</a>
<h1>Таблица Типов KDbg</h1>
KDbg может отображать содержимое отдельно взятых членов структурированных типов
данных, таким образом отсутствует необходимость в раскрытии переменных в
<a href="localvars.html">окне локальных переменных</a> или в 
<a href="watches.html">окне отслеживаемых выражений</a>. Информация о том, 
переменная какого члена отображается, хранится в <i>таблицах типов</i>. Обычно
существует одна таблица на разделяемую библиотеку.
<p>Таблицы типов KDbg расположены в каталоге 
<tt>$TDEDIR/share/apps/kdbg/types</tt>. Имена файло таблиц оканчиваются на
<tt>.kdbgtt</tt>. Например, таблица типов для <tt>libtqt.so</tt> называется
<tt>qt.kdbgtt</tt>.
<p>Файлы таблиц типов соответствуют стандартному синтаксису файлов конфигурации
KDE. Файл содержит следующие группы:
<ul>
<li>
Группу <tt>[Type Table]</tt>, в которой перечислены типы и информация о том,
как отладчик может определить, слинкована ли программа с этой библиотекой.</li>

<li>Группу на каждый прописанный тип, в которой содержится информация о том, 
как KDbg должен отображать данный тип.</li>
</ul>
Для определения таблиц типов, применимых к отлаживаемой программе, KDbg 
запрашивает список разделяемых библиотек, с которыми слинкована программа.
Затем он осуществляет поиск имен этих библиотек в таблицах типов в элементах
<tt>ShlibRE</tt>. Используются те таблицы, в которых были найдены 
соответствующие имена библиотек. Если тип появляется в нескольких таблицах, то 
неопределено, какое же из описаний будет выбрано.
<h2>Группа <tt>[Type Table]</tt></h2>
Эта группа содержит следующие элементы:
<ul>
<li>
<tt>Types1</tt>, <tt>Types2</tt>, и тд. Эти элементы являются именами типов.
Каждый из них представляет собой разделенный запятыми список имен типов. В 
каждом элементе может быть перечислено любое количество типов. (Имена типов
можно разбить на несколько строк, чтобы они строки не получались слишком 
длинными.) В этих строках недопустимы символы пробела. Элементы должны 
нумероваться последовательно (KDbg прекращает чтение на первом же пропуске),
однако элементы могут быть пусты (т.е. вообще не содержать типов). Иногда
порядок перечисления имен имеет значение (см. пример с <tt>Alias</tt> ниже).
</li>

<li>
<tt>ShlibRE</tt>. KDbg использует этот элемент для определения, использовать
ли данную таблицу к текущей отлаживаемой программе. Для этого KDbg определяет
разделяемые библиотеки, используемые программой. Если хотя бы одна из них
совпадает со значением этого элемента, таблица используется. Используемые
регулярные выражения совпадают с регулярными выражениями TQt (метасимволы
<tt>.*?[]^$\</tt> распознаются обычным образом, однако отсутсвует возможность
группировать символы.)</li>

<li>
<tt>LibDisplayName</tt>. Этот элемент используется в списках, в которых 
доступные таблицы типов перечислены для указания данной таблицы типов.</li>

<br><font size=-1>На данный момент это не используется.</font></ul>

<h2>Группа типа</h2>
На каждый заявленый тип должна быть заведена группа, названная именем типа.
<font size=-1>На данный момент шаблоны С++ не поддерживаются.</font> 
Каждая группа содержит следующие элементы:
<ul>
<li>
<tt>Display</tt> указывает, как KDbg должен отображать значение этого типа.
Строка может содержать от 1 до 5 символов '<tt>%</tt>'. Они заменяются на
результаты выражений, описанных в элементах <tt>Expr</tt><i>x</i>.</li>

<li>Один или более <tt>Expr1</tt>, <tt>Expr2</tt>, и тд. Каждый из них должен
содержать <b>только одну</b> последовательность <tt>%s</tt>, которая будет
заменена выражением, чье значение необходимо получить. Такие выражения 
передаются gdb, а результат заносится на место соответствующего символа 
процента в элементе <tt>Display</tt>.</li>

<li>
<tt>Alias</tt> указывает на тип-псевдоним. Если присутствует данная запись, то
с данным типом обходятся также, как с тем, на который он указывает. Этот 
тип-псевдоним дожен быть описан перд ссылающимся на него типом в элементах
<tt>Types</tt><i>x</i> группы <tt>[Type Table]</tt>.</li>
</ul>
<font size=-1>На данный момент количество выражений для каждого типа ограничено
пятью. Это может быть с легкостью изменено, но я не рекомендую вообще 
приближаться к данному рубежу - это только затормозить процесс отладки.</font>
<p>KDbg распознает специальное расширение, которое используется для вывода
строк TQt 2.0 в unicode: Если перед <tt>Expr</tt><i>x</i> стоит 
<tt>/TQString::Data</tt>, подразумевается, что результат операции является
указателем на <tt>TQString::Data</tt>. Выводимое значение является строкой в
unicode, представленное <tt>TQString::Data</tt> (которое может быть 
<tt>TQString::null</tt>, если это пустая строка TQt, или <tt>(null)</tt>, если
<tt>unicode</tt> член структуры является нулевым указателем). Для примера см.
<tt>qt2.kdbgtt</tt>.

<p>Совет: Совсем необязательно описывать наследуемые типы, если они должны
обрабатываться также как и базовый класс - KDbg может определить наследование 
и использовать описание типа первого (слева) базового класса. Вы можете 
использовать элемент <tt>Alias</tt> для быстрого указания класса при 
множественном наследовании, отличного от первого слева.
<h2>Пример</h2>
Этот пример показывает, как <tt>TQString</tt> и <tt>TQObject</tt> описаны в
<tt>qt.kdbgtt</tt>. Дополнительно определен <tt>TQTableView</tt>, ссылающийся
на <tt>TQObject</tt>. Этот пример применим к TQt 1.x, который расположен в
разделяемых библиотеках, имена которых оканчиваются как <tt>libtqt.so.1</tt>.
<pre>[Type Table]
Types1=TQString
Types2=TQObject,TQTableView
LibDisplayName=libtqt 1.x
ShlibRE=libtqt\.so\.1$
[TQString]
Display={ % }
Expr1=(%s).shd->data
[TQObject]
Display={ name=% #chld=% }
Expr1=(%s).objname
Expr2=(%s).childObjects->numNodes
[TQTableView]
Alias=TQObject</pre>
Замечание: гораздо безопаснее заключать <tt>%s</tt> в скобки.
</body>
</html>