Dicas Rápidas Ferramentas Protheus

Depuração de Código (Debug)

Escritor por Vinícius Gregório

 

Depuração de código, ou debugging, é o processo pelo qual o desenvolvedor ou analista de testes executa um programa acompanhando passo-a-passo a sua execução, afim de encontrar erros no código e corrigi-los.

 

Dessa forma, é possível ver e editar o valor definido para cada variável, acompanhar a execução de cada comando compilado no programa e executar outros comandos em tempo real, alterando o comportamento final da rotina.

 

Vamos ver como funciona esse processo no TOTVS Protheus:

 

A imagem acima exibe as diversas áreas do TOTVS DevStudio que serão utilizadas durante o processo de depuração de código:

 

1- Barra de Título: Durante a execução da Depuração, a mensagem exibida antes do nome do arquivo, na Barra de Título do DevStudio, indica para o usuário o status do processo.

 

Debugando = a execução está parada em um dos pontos definidos e esperando uma resposta do usuário. Nesse momento, o usuário pode interagir com o processo, adicionando outros pontos de parada, observando ou alterando conteúdo de variáveis e executando outros comandos.

 

Executando = o programa está executando normalmente, até encontrar o próximo ponto de parada ou até o seu término;

 

2- Ambiente em Execução: Essa caixa de seleção indica para o usuário qual o ambiente em que o processo de depuração será executado. Esse ambiente segue as configurações existentes na IDE e é necessário que o programa esteja compilado no RPO do ambiente selecionado.

 

Caso queira saber mais a respeito, leia este artigo: Utilização do Development Studio.

 

3- Acesso rápido aos controles de Depuração: Nessa área estão os botões de acesso rápido para os controles do processo de depuração. Nesses itens é possível iniciar/continuar o processo, congelar o fluxo de processamento e parar definitivamente a execução do programa. Funciona como um controle de um player multimedia 😉

 

4- Módulo/Rotina a ser executada: Essa configuração indica qual o módulo do sistema em que o processo será inicializado. Ou seja, quando você iniciar a depuração, o Protheus irá abrir nesse módulo. Também é possível iniciar o processo diretamente na rotina em questão, mas para isso é necessário definir o ambiente dentro da rotina (PREPARE ENVIRONMENT).

 

5- Barra de Pontos de Parada: Ao lado esquerdo da área de edição dos arquivos de código-fonte existe uma barra com o número da linha e uma área cinza ao lado.

 

Ao clicar nessa área, a IDE irá marcar a linha correspondente com um círculo vermelho nesse espaço. Isso é um ponto de parada; uma definição para que, quando em depuração, o DevStudio pare a execução do programa naquela linha e aguarde até uma ação do usuário para que possa continuar.

 

6- Aba de Comandos: Essa aba contém apenas uma área de edição em branco. Enquanto o DevStudio estiver parado em um ponto de parada marcado no fonte, é possível inserir comandos AdvPL nessa área e, após a confirmação da linha com um ENTER, ver o resultado do processamento do comando logo em seguida. Isso é extremamente útil para imprimir e alterar valores de variáveis enquanto o programa estiver em execução.

 

7- Aba de Watchs: Nessa área é possível observar o valor das variáveis e, conforme o usuário percorrer a execução dos comandos, esses valores são atualizados automaticamente.

 

Fonte de Exemplo

 

Abaixo, criamos um fonte de exemplo simples para que você possa testar todas as funcionalidades do processo de depuração e não tem utilidade prática de negócio (embora você possa utilizá-lo como estrutura de exemplo para seus próprios programas, se quiser).

 

É uma rotina com uma mBrowse utilizando a tabela de clientes do Protheus (SA1) porém, ao invés de criar uma rotina de manutenção de cadastro, criamos uma tela simples nas opções laterais da tela, para que você possa testar os Watchs também em objetos.

 

#INCLUDE "Protheus.ch"
#INCLUDE "TopConn.ch"

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma  ³RTSTA01   ºAutor  ³Vinícius Gregório   º Data ³  09/10/13   º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc.     ³ Rotina fake para o tutorial sobre debug                    º±±
±±º          ³                                                            º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso       ³ AcademiaERP                                                º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function RTSTA01()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³Declaração de variáveis³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Private cCadastro := "Rotina fake para o tutorial sobre debug"
Private aRotina := MenuDef()

dbSelectArea("SA1")
SA1->(dbSetOrder(1))

mBrowse( 6,1,22,75,"SA1")

dbSelectArea("SA1")
dbSetOrder(1)

Return

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma  ³RTSTA01C  ºAutor  ³Vinícius Gregório   º Data ³  09/10/13   º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc.     ³ Função para desenhar uma dialog simples                    º±±
±±º          ³                                                            º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso       ³ AcademiaERP                                                º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function RTSTA01C(cAlias,nRecn,nOpcx)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Declaracao de variaveis  ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Local nOpcA 	:= 0
Local nI	:= 0
Local aSize	:= MsAdvSize()

Local bOk       := {|| If( U_TST03TOK(), ( nOpcA := 1, oDlgMain:End() ),;
nOpcA := 0 ) }
Local bCancel   := {|| nOpcA := 0, oDlgMain:End() }

Private oDlgMain	:= Nil
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³Cria a tela para o usuario³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
oDlgMain := MSDIALOG():New(aSize[7],00,aSize[6],aSize[5],cCadastro,;
,,,,,,,/*oMainWnd*/,.T.)

ACTIVATE MSDIALOG oDlgMain ON INIT EnchoiceBar(oDlgMain,bOk,bCancel)

If nOpcA == 1

	MsgInfo("OK")

EndIf

Return

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma  ³TST01TOK  ºAutor  ³Vinícius Gregório   º Data ³  09/10/13   º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc.     ³ Rotina para a validação no OK.                             º±±
±±º          ³                                                            º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso       ³ AcademiaERP                                                º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function TST01TOK()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³Declaração de variáveis³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Local lRet   	:= .T.

Return(lRet)

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma  ³MenuDef   ºAutor  ³Vinícius Gregório   º Data ³  09/10/13   º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc.     ³                                                            º±±
±±º          ³                                                            º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso       ³ AcademiaERP                                                º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/

Static Function MenuDef()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³Declaração de variáveis³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Private aRotina   := {{ "Pesquisar"	,"PesqBrw"		      , 0, 1},;
		{ "DIALOG"		,"U_RTSTA01C('SA1',Recno(),2)",	0, 2}}

Return(aRotina)

 

Iniciando a depuração

 

Após verificar as configurações de ambiente e módulo da IDE, copiar o fonte de exemplo e compilá-lo, estamos prontos para começar um debug e ver como funciona.

 

Pressione a tecla F5 para iniciar o processo ou aperte o botão play na barra de acesso rápido aos controles de execução. Uma instância do TOTVS Protheus será iniciada e exibida para o usuário.

 

 

Ao retornar para o DevStudio, repare no texto que aparece ao lado do nome do programa em execução, na Barra de Título.

 

 

Conforme mencionamos anteriormente, esse texto indica que o DevStudio está executando um processo de depuração de código e está em Execução (processamento sem interferência do usuário);

 

Para prosseguir com os testes, execute o login no Protheus normalmente e selecione o módulo onde nossa rotina de testes foi disponibilizada.

 

Após autenticar o usuário no sistema, vamos voltar para a IDE e inserir um ponto de parada em nosso programa. Para isso, basta clicar na barra lateral cinza de uma das linhas de seu programa, como na imagem abaixo:

 

imagem4

 

Repare que a IDE nos indica o status da execução através da seta amarela. É ela que nos mostra qual linha do fonte está sendo executada. Quando você insere um ponto de parada é marcada na IDE uma esfera vermelha ao lado da linha de código, como mostrado abaixo:

 

 

Quando a execução do código está na linha marcada como um ponto de parada a IDE exibe a seta amarela sobre a esfera vermelha, como na imagem:

 

ide-antiga-10

 

Watchs

 

A janela de Watchs da IDE é onde podemos observar (entendeu? entendeu? rs) o valor das variáveis, em tempo real. Essa funcionalidade é de enorme valia para o desenvolvedor e fundamental para o debug!

 

É comum utilizarmos o processo de depuração algumas vezes durante o dia e, observando o valor das variáveis, encontrar exceções na base de dados ou nos valores inseridos pelo usuário final do sistema que podem ocasionar em erros em nossa aplicação.

 

Para adicionar uma variável, selecione o texto com o nome da variável e, clicando e segurando com o botão direito do mouse sobre essa seleção, arrastar para a janela de Watchs:

 

 

A janela de watchs exibe uma série de informações sobre o conteúdo de uma variável:

 

 

Na imagem podemos ver que a janela exibe o nome da variável e, caso ela seja um array ou objeto, o Watch exibe também um treeview, que pode ser expandida, com os subitens da variável.

 

Além dessa possibilidade, os Watchs exibem ícones específicos por tipo de variável, além de uma coluna no centro com a primeira letra de cada tipo.

 

A terceira coluna exibe o valor atual presente na variável. Conforme a execução do programa interagir com cada uma dessas variáveis e alterar o seu valor, em tempo real, a IDE irá atualizar esses valores para que você possa acompanhar.

Fique atualizado, É GRÁTIS!
Cadastre o seu endereço de e-mail e fique por dentro de todas as atualizações da AcademiaERP.
Não enviamos spam.

Comandos de controle da execução

 

Durante a execução da depuração existem diversos comandos que o usuário pode enviar para a IDE controlar a forma como a execução ocorre. Esses comandos estão listados no menu Executar do DevStudio, conforme imagem abaixo:

 

 

Porém, em geral, utilizamos diretamente alguns atalhos:

 

F5: Informa para a IDE que ela pode prosseguir com o processamento do programa, até o próximo ponto de parada definido. Caso a execução não encontre nenhum ponto de parada posterior, a execução irá correr normalmente até o final. Atente que esse atalho também é utilizado para iniciar uma sessão de debug;

 

F8: Executa os comandos da linha posicionada e posiciona na próxima linha da execução. Caso essa linha realize chamada para alguma função, o DevStudio irá posicionar o usuário na primeira linha dessa função para que ele possa continuar com o processo a partir daí;

 

F10: Executa os comandos da linha posicionada em background e passa para a próxima linha do código-fonte. Esse atalho é útil quando não queremos que a IDE nos envie para uma função utilizada na linha, somente processe o retorno dessa função e nos posicione para a próxima 🙂

 

CTRL+F5: Envia sinal para interromper o processo de depuração. Esse comando pode demorar um pouco para ser executado, dependendo de que tipo de instruções o Protheus estava executando antes de receber o sinal de término.

 

Comandos em tempo real

 

Agora vamos fazer um teste e alterar o valor de uma variável durante a execução de um programa.

 

Ao executar nossa rotina e clicar na opção DIALOG  do menu lateral da mBrowse, veremos a seguinte tela:

 

 

Na realidade é uma tela em branco, sem nenhum componente adicionado a ela -_-‘.

 

Mas você pode reparar no título da janela na parte superior? Esse título é definido pela variável cCadastro em nosso fonte e, durante a execução do programa, podemos alterar o seu valor.

 

Para isso, precisamos definir um ponto de parada durante a execução do programa e, através da aba de Comandos, executar um comando AdvPL de atribuição de comando. Veja na imagem abaixo:

 

 

Repare que, após digitar o comando e confirmar com o ENTER, a IDE nos exibe o resultado da execução. No nosso caso, ela exibe o novo resultado da variável.

Se abrirmos novamente a tela, selecionando a opção DIALOG, veremos que o título da janela foi alterado! Isso sem a necessidade de alterar o código, compilar, iniciar novamente o Protheus

 

 

Lembre-se que outros comandos podem ser executados nessa aba, tornando o processo de encontrar um erro e testar hipóteses de como corrigi-lo muito mais simples.

 

Outra forma de realizar o processo de alterar o valor de variáveis durante a execução é arrastar a variável para a janela de Watchs e selecionar a opção Editar após clicar com o botão direito sobre ela.

 

Conclusão

 

Espero que esse artigo tenha ajudado a entender como funciona a depuração de código!

 

Aproveite também o código-fonte de exemplo e teste outras possibilidades, como observar o objeto oDlgMain, codificar validações na função TST01TOK, …

 

Após utilizar essas funcionalidades algumas vezes, o processo todo ficará extremamente simples e natural, tornando-se rotina no seu dia de trabalho como desenvolvedor 🙂

 

Abraços

 

Sobre o Autor

Vinícius Gregório

Tecnólogo em análise de sistemas da informação pela Faculdade IBTA (SP), empreendedor da área de TI e consultor Protheus especializado em desenvolvimento AdvPL. Trabalhou em diversos projetos com os módulos de Compras, Estoque/Custos, Faturamento, Contabilidade Gerencial, Field Service/Gestão de Serviços, Financeiro, Gestão de Contratos e Gestão de Projetos. Atua também como desenvolvedor de sistemas web e é usuário fanático de sistemas e softwares open source... (vinicius.gregorio@academiaerp.com.br)

Deixe um comentário

Dúvida?