Depurador
Pontos de parada com condição, grupos e mensagem de registro, valores na própria linha, dica ao passar o mouse, janelas de variáveis, registradores, memória e módulos, ponto de dado e anexar a um processo.
O RAD traz um depurador nativo para o Windows de 64 bits: ele roda o seu programa sob a API de depuração do sistema, lê o .pdb que o fc gera e mostra tudo dentro da IDE. Para programas em ByteCode o RAD fala com a máquina virtual (fxvm) por um protocolo próprio; a maior parte do que está abaixo vale para os dois, e os pontos em que só o nativo faz algo estão marcados.
Começando: F9 e um ponto de parada#
F5 liga e desliga um ponto de parada na linha do cursor (a linha fica vermelha e aparece a bolinha na calha). F9 compila (gravando antes, se a opção estiver ligada) e executa sob o depurador. Quando o programa chega no ponto, o RAD para e mostra a linha atual em azul.
Add3 chamada por main).Repare que, no fim da linha atual, o editor mostra em cinza o valor das variáveis que ela usa (Result = 0, AFirst = 1…): são os valores inline, que se atualizam a cada passo.
Os comandos de execução#
| Atalho | O que faz |
|---|---|
| F9 | executa / continua |
| F8 | passo sobre: executa a linha sem entrar nas chamadas |
| F7 | passo para dentro: entra na rotina chamada |
| Shift+F8 | passo para fora: roda até sair da rotina atual |
| F4 | executa até o cursor |
| Ctrl+Shift+F9 | define a próxima instrução (pula para a linha do cursor) |
| Ctrl+F2 | para a execução (mata o programa; num processo anexado, só desanexa) |
| Ctrl+Alt+M | step só no meu código (ligado por padrão, só nativo): F7 e F8 não entram na RTL nem na WCL |
Todos estão no menu Depurar:
Dica ao passar o mouse#
Com o programa parado, deixe o mouse meio segundo sobre uma variável: aparece uma dica com Nome: Tipo = Valor. Sobre uma rotina, método ou tipo, a dica mostra a assinatura e onde ele foi declarado. Para valores compostos (record, vetor, objeto) a dica vira uma árvore que se expande.
AFirst.As abas Pilha, Variáveis e Threads#
Enquanto está parado, o painel da esquerda troca o Inspetor pelas abas Pilha, Variáveis e Threads. Na pilha, clicar num quadro leva o editor até a linha dele (Ctrl+Alt+↑ / ↓ sobem e descem os quadros). Quando um quadro está na RTL ou na WCL, o RAD abre o fonte dela como uma aba somente leitura, com a linha de execução marcada.
Janelas de inspeção#
Cada visão tem a sua janela, aberta pelo menu Depurar ou pelo atalho. Elas se atualizam a cada parada e destacam com ▲ o que mudou desde a parada anterior.
| Janela | Atalho | Para que serve |
|---|---|---|
| Variáveis locais | Ctrl+Alt+L | as locais e parâmetros do quadro atual |
| Janela de watches | Ctrl+Alt+W | expressões que você quer acompanhar (Ctrl+F5 adiciona uma) |
| Registradores | Ctrl+Alt+R | RAX…R15, RIP (com arquivo:linha), EFLAGS e segmentos |
| Memória | Ctrl+Alt+Y | despejo hexadecimal com ASCII; aceita endereço, registrador (RSP) ou variável; ◀ ▶ navegam |
| Módulos | Ctrl+Alt+U | o executável e as DLLs carregadas (base, nome, caminho; ● = tem .pdb) |
| Log de eventos | Ctrl+Alt+E | processo, threads, módulos, paradas, exceções, OutputDebugString e tracepoints |
| Pontos de parada | Ctrl+Alt+B | a lista de todos os pontos, com grupos |
Add3.
RSP (a pilha do processo). Só no depurador nativo.
Dbg10.exe (● = tem .pdb) e as DLLs do sistema.
Pontos de parada com condição, grupos e registro#
Ctrl+Shift+F5 (menu Propriedades do ponto de parada) abre a caixa de propriedades do ponto da linha atual:
| Campo | O que faz |
|---|---|
| Condição | só para quando a expressão for verdadeira (I > 10 and Total <> 0, Cor = 2, Lista[3] >= 5) |
| Passagem número | para só na N-ésima vez que passa pelo ponto (0 ou 1 = toda vez) |
| Grupo | agrupa pontos para ligar e desligar vários de uma vez |
| Mensagem de registro | torna o ponto um tracepoint: ele não para, só escreve a mensagem no log; {Expr} vira o valor da expressão (i = {I}, total = {Total}) |
| Ativar / Desativar o grupo | ao passar por este ponto, liga ou desliga outro grupo |
| Registrar a pilha | grava a pilha de chamadas no log a cada passagem |
| Não parar o programa | o ponto só executa as ações acima |
Os pontos ficam gravados ao lado do projeto (<Nome>.breakpoints) e voltam quando você reabre.
Ponto de dado: "pare quando esta variável mudar"#
Ctrl+Alt+D, com o programa parado, pede o nome de uma variável (GContador, LTotal, GPonto.X, GLista[2]). O programa passa a parar sempre que a memória dela for escrita (e, se você marcar a caixa, também quando for lida). Vale para 1, 2, 4 ou 8 bytes e até 4 pontos ao mesmo tempo, porque no depurador nativo isso usa os registradores de depuração do processador (DR0–DR3).
Anexar a um processo que já está rodando#
Ctrl+Alt+A lista os processos da máquina, com filtro por nome, caminho ou PID. Os que têm um .pdb ao lado do .exe vêm marcados com ● (dá para depurar com fonte, linhas e variáveis). Ao anexar, o programa para na hora, com a pilha completa descendo pelas DLLs do Windows até o seu código. Ctrl+F2 desanexa sem matar o processo.
Exceções#
Por padrão o depurador para nas exceções graves (violação de acesso, divisão por zero…). Em Exibir > Opções > Depurador você escolhe entre parar só nas graves, em todas já na primeira chance, ou só nas que ninguém tratou, e lista códigos de exceção (em hexadecimal) em que nunca deve parar. A mesma aba escolhe quem lê o .pdb: a dbghelp.dll do Windows (padrão) ou o leitor próprio do RAD (Rad.Pdb).
O que ainda não existe#
- Disassembly (janela de CPU, passo por instrução, F7 em código sem fonte): depende de um decodificador x86-64 que o compilador ainda vai oferecer.
- F8 chamada por chamada numa cadeia fluente (
A.B().C().D): o passo hoje vai de linha em linha. - ByteCode: ponto de dado, grupos e "step só no meu código" não foram provados lá; editar e continuar também depende da
fxvm.