<chapter id="debugger">
<title
>A Interface do Depurador</title>
<indexterm zone="debugger"
><primary
>depurador</primary
></indexterm>

<para
>Para o C e C++, o &kdevelop; 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 &kdevelop; usa o <application
>GDB</application
>, como tal, para compreender por completo as funcionalidades de depuração do &kdevelop;, 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
>kdevelop/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 &kdevelop; 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 &kdevelop; 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 -->
