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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
|
<chapter id="debugger">
<title
>A Interface do Depurador</title>
<indexterm zone="debugger"
><primary
>depurador</primary
></indexterm>
<para
>Para o C e C++, o &tdevelop; contém um depurador interno que está integrado directamente com o editor. Do ponto de vista técnico, está implementado como uma interface para o depurador multi-plataforma da &GNU; <application
>gdb</application
> através de um 'pipe'. O depurador poderá ser iniciado de várias formas: </para>
<itemizedlist>
<listitem>
<para
>Com a opção <menuchoice
><guimenu
>Depurar</guimenu
><guimenuitem
>Iniciar</guimenuitem
></menuchoice
>, o programa principal do seu projecto é carregado no depurador. </para>
</listitem>
<listitem>
<para
>Se usar a opção <menuchoice
><guimenu
>Depurar</guimenu
> <guimenuitem
>Iniciar (outro)</guimenuitem
> <guimenuitem
>Examinar o ficheiro 'core'</guimenuitem
></menuchoice
>, poderá carregar um ficheiro de 'core' para a memória, o qual é gerado pelo 'kernel' do sistema operativo, quando o programa tiver estoirado (A geração de ficheiros 'core' poderá estar desligada no seu sistema; veja o <application
>ulimit(1)</application
>). Isto é útil para uma análise 'post-mortem' de um programa. </para>
</listitem>
<listitem>
<para
>Com a opção <menuchoice
><guimenu
>Depurar</guimenu
> <guimenuitem
>Iniciar (outro)</guimenuitem
> <guimenuitem
>Anexar a um processo</guimenuitem
></menuchoice
>, poderá invocar o depurador sobre um programa já em execução. Irá ver uma lista de processos onde poderá seleccionar o processo que o depurador deverá capturar. </para>
</listitem>
<listitem>
<para
>Lembre-se que a depuração só é possível se o seu projecto tiver sido compilado com as informações de depuração activas. Poderá ser activada na janela de <guibutton
>Opções do compilador</guibutton
>. Quando esta opção estiver activa, o compilador gera dados adicionais que permitem ao depurador associar nomes de ficheiros e números de linha aos endereços do executável. </para>
</listitem>
</itemizedlist>
<para
>A interface do depurador oferece várias vistas <quote
>dentro</quote
> do processo: </para>
<para
>Se tentar depurar um projecto sem informação de depuração, irá obter a mensagem <computeroutput
>Sem código...</computeroutput
> na barra de estado. Se tentar definir um ponto de paragem, é mostrado como <computeroutput
>Pendente (adicionar)</computeroutput
> na janela do ponto de paragem (ver abaixo). </para>
<variablelist>
<varlistentry>
<term
>Variáveis</term>
<listitem>
<indexterm zone="debugger"
><primary
>variáveis de vigia</primary
></indexterm>
<para
>Esta janela lista os valores de todas as variáveis locais no ponto de execução actual do programa. Ela cobre as variáveis na pilha de chamadas completa, &ie; a função onde o processo foi interrompido, a função que chamou esta função, e assim por diante até à função <function
>main()</function
>. </para>
<para
>Outra ramificação nas variáveis contém as variáveis de vigia. Poderá configurar por si próprio as variáveis que são aqui mostradas. Tanto poderão ser vigiadas as variáveis locais como as globais. Poderá adicionar as variáveis se carregar no botão <guibutton
>Adicionar</guibutton
> ou carregar em <keycap
>Return</keycap
>, enquanto o item <guilabel
>Vigia</guilabel
> estiver seleccionado. Eles poderão ser removidos de novo, através do menu de contexto. </para>
</listitem>
</varlistentry>
<varlistentry>
<term
>Pilha de Chamadas</term>
<listitem>
<indexterm zone="debugger"
><primary
>pilha de chamadas</primary
></indexterm>
<para
>(... ainda não escrito ...) </para>
</listitem>
</varlistentry>
<varlistentry>
<term
>Pontos de Paragem</term>
<listitem>
<indexterm zone="debugger"
><primary
>pontos de paragem</primary
></indexterm>
<para
>Esta janela permite-lhe ver e manipular os pontos de paragem. Lembre-se que o &tdevelop; usa o <application
>GDB</application
>, como tal, para compreender por completo as funcionalidades de depuração do &tdevelop;, deverá ler um pouco sobre o <ulink url="http://www.gnu.org/software/gdb"
>GDB</ulink
>. </para>
<para
>Se quiser olhar para o código-fonte, os pontos de paragem estão definidos no <filename
>tdevelop/languages/cpp/debugger/breakpoint.h</filename
>. </para>
<para
>Do lado esquerdo, a janela tem botões para:</para>
<itemizedlist>
<listitem
><para
>Adicionar um ponto de paragem vazio</para
></listitem>
<listitem
><para
>Editar o ponto de paragem seleccionado</para
></listitem>
<listitem
><para
>Remover o ponto de paragem seleccionado</para
></listitem>
<listitem
><para
>Remover todos os pontos de paragem</para
></listitem>
</itemizedlist>
<para
>A parte principal da janela é uma tabela com 7 colunas. Cada linha da tabela é um ponto de paragem. As colunas são:</para>
<orderedlist>
<listitem
><para
>Opção de selecção</para
></listitem>
<listitem
><para
>Tipo: um dos seguinte: Inválido, Ficheiro:Linha, Ponto de Vigia, Endereço, Função</para
></listitem>
<listitem
><para
>Estado. Os valores são:</para>
<itemizedlist>
<listitem
><para
>Activo</para
></listitem>
<listitem
><para
>Inactivo: Cada ponto de paragem poderá estar <quote
>activo</quote
> ou <quote
>inactivo</quote
>; no último caso, não fará efeito no seu programa até que o active de novo.</para
></listitem>
<listitem
><para
>Pendente (adicionar): um ponto de paragem fica marcado desta forma se não estiver disponível nenhuma informação de depuração. Na página do 'info' do GDB: <blockquote
><para
>Se a localização de um dado ponto de paragem não puder ser encontrada, poder-se-á dever ao facto que a localização esteja numa biblioteca dinâmica ainda por carregar. Nesse caso, poderá querer que o GDB crie um ponto de paragem especial (conhecido por <quote
>ponto de paragem pendente</quote
>) que tentará resolver-se a si próprio no futuro, quando for carregada a biblioteca dinâmica adequada.</para
> </blockquote
> </para
></listitem>
</itemizedlist>
</listitem>
<listitem
><para
>Pendente (limpar)</para
></listitem>
<listitem
><para
>Pendente (modificar)</para
></listitem>
<listitem
><para
>Localização no formato nome-ficheiro:número-linha</para
></listitem>
<listitem
><para
>Condição</para
></listitem>
<listitem
><para
>Ignorar a Contagem: Se este for um número <varname
>QUANTIDADE</varname
> maior que zero, as próximas <varname
>QUANTIDADE</varname
> vezes que o ponto de paragem for atingido, a execução do seu programa não irá parar; para além de decrementar o número de vezes a ignorar, o <application
>gdb</application
> não irá fazer nada.</para
></listitem>
<listitem
><para
>Contagem: indica quantas vezes foi atingido um ponto de paragem.</para
></listitem>
</orderedlist>
</listitem>
</varlistentry>
<varlistentry>
<term
>Descodificação</term>
<listitem>
<indexterm zone="debugger"
><primary
>descodificação</primary
></indexterm>
<para
>(... ainda não escrito ...)</para>
</listitem>
</varlistentry>
</variablelist>
<sect1 id="settingbreakpoints">
<title
>Definir Pontos de Paragem</title>
<para
>(... ainda não escrito ...) </para>
</sect1
> <!-- settingbreakpoints -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<sect1 id ="debuggeroptions">
<title
>Opções</title>
<variablelist>
<varlistentry>
<term
>Mostrar os Nomes Codificados</term>
<listitem>
<indexterm zone="debugger"
><primary
>codificação do nome</primary
></indexterm>
<indexterm zone="debugger"
><primary
>codificação</primary
><secondary
>nome</secondary
></indexterm>
<para
>No C++, os nomes das funções no executável são <quote
>codificados</quote
>, &ie; os nomes das funções incluem a informação sobre os tipos de argumentos recebidos. Isto é necessário para suportar a sobreposição ('overloading') de funções. O algoritmo de codificação não é normalizado e difere mesmo entre várias versões do compilador de C++ da &GNU;. </para>
<para
>Na janela de descodificação, são mostrados os nomes normalmente descodificados, como tal as assinaturas das funções irão aparecer como existem no código-fonte, por isso são fáceis de ler. Em alternativa, poderá querer ver os nomes codificados. </para>
</listitem>
</varlistentry>
<varlistentry>
<term
>Tentar Definir Pontos de Paragem ao Carregar as Bibliotecas</term>
<listitem>
<indexterm zone="debugger"
><primary
>pontos de paragem tardios</primary
></indexterm>
<indexterm zone="debugger"
><primary
>pontos de paragem</primary
><secondary
>tardios</secondary
></indexterm>
<para
>A infra-estrutura do depurador <application
>gdb</application
> não permite definir pontos de paragem em código que ainda não está carregado de momento. Numa aplicação altamente modular, onde muitas vezes o código só é carregado a pedido, como um 'plugin' (com a função da 'libc' <function
>dlopen(3)</function
>), isto poderá ser inconveniente. Como tal, o &tdevelop; contém o seu próprio suporte para os pontos de paragem em bibliotecas dinâmicas. Se definir esta opção, ela permitir-lhe-á definir pontos de paragem nas bibliotecas que ainda não estão carregada. Aí, sempre que o <application
>gdb</application
> notificar que uma biblioteca vai ser carregada, o &tdevelop; tentará definir os pontos de paragem pendentes. </para>
</listitem>
</varlistentry>
<varlistentry>
<term
>Activar a Barra de Ferramentas Flutuante</term>
<listitem>
<indexterm zone="debugger"
><primary
>barra de ferramentas do depurador</primary
></indexterm>
<indexterm zone="debugger"
><primary
>barra de ferramentas</primary
><secondary
>depurador</secondary
></indexterm>
<para
>(... ainda não escrito ...) </para>
</listitem>
</varlistentry>
</variablelist>
</sect1
> <!-- debuggeroptions -->
</chapter
> <!-- debugger -->
|