Fenner
RAD

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.

O RAD parado num ponto de parada, com a pilha de chamadas à esquerda
Parado no ponto de parada: a linha azul é a próxima a executar, e o painel da esquerda mostra a pilha de chamadas (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#

AtalhoO que faz
F9executa / continua
F8passo sobre: executa a linha sem entrar nas chamadas
F7passo para dentro: entra na rotina chamada
Shift+F8passo para fora: roda até sair da rotina atual
F4executa até o cursor
Ctrl+Shift+F9define a próxima instrução (pula para a linha do cursor)
Ctrl+F2para a execução (mata o programa; num processo anexado, só desanexa)
Ctrl+Alt+Mstep 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:

O menu Depurar com todos os comandos e atalhos
O menu Depurar: execução e passos, pontos de parada, avaliação e todas as janelas de inspeção.

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.

Dica sobre AFirst mostrando AFirst: Int32 = 1
A dica de valor sobre 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.

Aba Variáveis com AFirst, ASecond, AThird, Result e as globais
A aba Variáveis: parâmetros e locais do quadro atual, e os globais do programa.
Aba Threads
A aba Threads: uma linha por thread do processo, com a que parou 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.

JanelaAtalhoPara que serve
Variáveis locaisCtrl+Alt+Las locais e parâmetros do quadro atual
Janela de watchesCtrl+Alt+Wexpressões que você quer acompanhar (Ctrl+F5 adiciona uma)
RegistradoresCtrl+Alt+RRAX…R15, RIP (com arquivo:linha), EFLAGS e segmentos
MemóriaCtrl+Alt+Ydespejo hexadecimal com ASCII; aceita endereço, registrador (RSP) ou variável; ◀ ▶ navegam
MódulosCtrl+Alt+Uo executável e as DLLs carregadas (base, nome, caminho; ● = tem .pdb)
Log de eventosCtrl+Alt+Eprocesso, threads, módulos, paradas, exceções, OutputDebugString e tracepoints
Pontos de paradaCtrl+Alt+Ba lista de todos os pontos, com grupos
Janela Variáveis locais
Variáveis locais do quadro Add3.
Janela de memória mostrando o despejo hexadecimal a partir de RSP
A janela de Memória, aqui a partir do registrador RSP (a pilha do processo). Só no depurador nativo.
Janela Módulos com o exe e as DLLs
A janela de Módulos: o Dbg10.exe (● = tem .pdb) e as DLLs do sistema.
Log de eventos com filtros por tipo
O Log de eventos, com o tempo de cada evento e filtros por tipo; "Copiar tudo" leva o texto para a área de transferência.

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:

Caixa de propriedades do ponto de parada
Propriedades de um ponto de parada.
CampoO que faz
Condiçãosó para quando a expressão for verdadeira (I > 10 and Total <> 0, Cor = 2, Lista[3] >= 5)
Passagem númeropara só na N-ésima vez que passa pelo ponto (0 ou 1 = toda vez)
Grupoagrupa pontos para ligar e desligar vários de uma vez
Mensagem de registrotorna 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 grupoao passar por este ponto, liga ou desliga outro grupo
Registrar a pilhagrava a pilha de chamadas no log a cada passagem
Não parar o programao ponto só executa as ações acima

Os pontos ficam gravados ao lado do projeto (<Nome>.breakpoints) e voltam quando você reabre.

Janela com a lista de pontos de parada e os botões de ação
A lista de pontos, com os botões Ativar/Desativar, Condição…, Ir para, Remover, Limpar e Ativar/Desativar grupo.

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).

Caixa do ponto de dado
A caixa do ponto de dado.

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.

Caixa Anexar ao processo
A caixa Anexar ao 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).

Aba Depurador das Opções
A aba Depurador das Opções.

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.