Requisitos
- servidor/ambiente conectado
- usuário autenticado (se requerido)
- executor configurado
Recomendações
- NUNCA faça depuração em ambiente de produção
- Não use appServers compartilhado com terceiros, mesmo que ambientes diistintos
- Prefira sempre um ambiente local
- Clientes TCloud : Os ambientes que estão no TCloud em produção são bloqueados para depuração.
Promova o RPO para
DEV
e use esse ambiente, e se necessário, promova-o de volta para produção. Para detalhes, entre em contato com o suporte do TCloud.
Por quê não depurar em "produção"?
O processo de depuração, é composto de várias partes que se comunicam entre si e muitas vezes, aguardando ações dos usuários (continua, próxima passo, ...).
Quando estamos em uma depuração, pode ocorrer do VS-Code solicitar uma informação ao appServer e este "congela" todas as threads (conexões/usuário) para atender essa solicitação. Essa "congelada" pode levar até um ou mesmo dois segundos e isso acontece toda vez que o usuário que esta depurando, precisa tomar uma ação (continua, próximo passo...) e isso pode ser sentido por todos os usuários. Além disso o próprio usuário que esta depurando, vai receber informações de cada um dos usuários conectados, gerando uma troca constante de programas fontes ou informações irrelevantes naquele momento.
O appServer também envia para o VS-Code algumas informações, tais como, "olha estou nesse fonte e nessa linha" e pergunta "O quê quer que eu faça?". Nesse ponto, pode ser necessário o usuário que está depurando, responda com acionamento de uma ação, como por exemplo, "vá para a próxima instrução" ou "execute esta função até terminar". Enquanto o appServer aguarda a resposta do VS-Code, TODAS as threads ficam congeladas. E você foi no banheiro naquele momento. Dentro de alguns minutos terá um enxurrada de reclamações que o servidor travou.
Isso pode acontecer se tiver um, dez, cem, mil, usuários. Imagina o problema. Cresce exponencialmente ao número de usuários.>
Outra razão, é que devido ao processo de depuração do appServer, normalmente é necessário que o processo de depuração seja o primeiro a ser inicializados, pois somente as threads iniciadas após eles que serão passíveis de depuração e para garantir isso, é comum encerrar na "força" todas as threds no ar, principalmente se a depuração for em jobs, schedullers, rest, e outros do tipo.
Espero ter esclarecido porquê não deve usar ambiente "produção" em processos de depuração.
Recomendamos a leitura Debugging.
Acione o atalho CTRL + SHIFT + P
e execute TOTVS: Configure Launchers
que lhe apresentará um assistente de configuração de executores que permite criar uma nova configuração ou editar uma já existente. Preencha as informações solicitadas e acione Save
.
A definição de executores encontra-se nO arquivo .vscode/launch.json
que, normalmente, é criado através na abertura da página de Boas Vindas
. Caso isso não ocorra (devido a configurações do seu ambiente), você pode criá-lo manualmente executando:
- Na barra de atividades, acione o
Debug
- Na barra de ferramentas (parte superior) da visão de
Debug
, abra a lista de seleção e acioneAdd Configuration...
. - Comece a digitar
TOTVS
e selecione o tipo desejado- totvs_language_debug, para usar SmartClient Desktop
- totvs_language_web_debug, para usar SmartClient Html
- Preencha os atributos solicitados conforme seu ambiente
- Salve o arquivo
{
"version": "0.2.0",
"configurations": [
{
"type": "totvs_language_debug",
"request": "launch",
"name": "TOTVS Language Debug",
"program": "${command:AskForProgramName}",
"cwb": "${workspaceFolder}",
"smartclientBin": "/home/totvs12/bin/smartclient/smartclient",
"isMultiSession": true,
"enableTableSync": true
},
{
"type": "totvs_language_web_debug",
"request": "launch",
"name": "TOTVS Language Debug",
"program": "${command:AskForProgramName}",
"cwb": "${workspaceFolder}",
"smartclientUrl": "http://localhost:8080",
"isMultiSession": true,
"enableTableSync": true
}
]
}
No caso de efetuar depuração via SmartClient Html
, indique qual o navegador web será utilizado, no arquivo .\vscode\settings.json
.
{
...
"totvsLanguageServer.web.navigator": "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
...
}
| Veja Variable substitution.
Os executores do TDS-VSCode, além da variáveis de substituição do VS-Code, permite o uso de:
Variável | Uso/Função |
---|---|
${command:AskForProgramName} |
Solicita qual o programa a ser executado |
Ao utilizar ${command:AskForProgramName}
na configuração do executor, lhe será solicitado qual o prorama ou função a ser executada, com ou sem parâmetros.
user function u_myFunc(p1, p2, p3)
// processamento conforme parâmetros
...
return
Exemplos | Parâmetros |
---|---|
u_myFunc |
p1 =nil, p2 =nil, p3 =nil |
u_myFunc() |
p1 =nil, p2 =nil, p3 =nil |
u_myFunc("A") |
p1 ="A", p2 =nil, p3 =nil |
u_myFunc("A",,3) |
p1 ="A", p2 ="", p3 ="3" |
u_myFunc("A",.t.,3) |
p1 ="A", p2 =".t.", p3 ="3" |
| A passagem de parâmetros equivale a usar o argumento -a
do SmartClient
.
Acione o atalho CTRL + F5
para iniciar a execução e informe o nome da função/programa a ser executado, se solicitado.
Acione o atalho F5
para iniciar a depuração e informe o nome da função/programa a ser executada, se solicitado.
| Veja Debuggimg Actions e Variáveis de substituição.
É possível verificar valores de variáveis, conteúdo de tabelas e executar métodos/funções durante o processo de depuração.
- Coloque um ponto de parada onde achar necessário
- Quando a depuração parar no ponto indicado, abra a visão
Debug Console
- Digite uma operação ou variável AdvPL/4GL disponível em seu ambiente de depuração
- Para ver conteúdo de uma tabela, digite
table:nome_da_tabela
, por exemplotable:SM0
| Veja (Debug Console REPL)[https://code.visualstudio.com/docs/editor/debugging#_debug-console-repl]
O sincronismo de tabelas pode ser alterado por configuração no executor, usando a chave enableTableSync
. Por padrão, vem habilitado.
Também é possível alterar essa opção durante o processo de depuração acionando o atalho CTRL + SHOFT + P
, executando TOTVS: Toggle table sync
. Note que ao usar esse comando, o parâmetro do executor é alterado, portanto na próxima depuração irá utilizar essa definição.
| A principal característica de um serviço, é que a sua execução não esta diretamente relacionada a interface com o usuário (SmartClient) e normalmente, é executado em segundo plano pelo appServer.
- No arquivo de configuração do appServer (
ini
), comente a sessão[OnStart]
. - Ainda no arquivo de configuração do appServer, na sessão
[General]
e ajuste a chaveBUILDKILLUSERS=1
. - Reinicie a execução do appServer.
- Abra o arquivo
.vscode\launch.json
. - Localize a definição de executor que será utilizada e adicione a chave
"enableMultiThread": true
. - Crie um arquivo-fonte e adicione o código abaixo, adequando-o se necessário.
user function startRest()
//O nome do job REST e ambiente de execução dele, podem ser obtidos no arquivo
//de configuração do _appServer_.
//Detalhes da função em https://tdn.totvs.com/display/tec/StartJob
startjob("HTTP_START", "p12", .f.) //lwait, sempre dever ser false
sleep(15000) //aguarda o serviço ser inicializado. Ajuste o tempo se necessário.
alert(">> Serviço REST inicializado. <<")
return
- No arquivo de configuração do appServer (
ini
), na sessão[OnStart]
deixe ativo somente os serviços necessários na depuração e na chaveRefreshRate
, informe o intervalo de30
segundos. - Ainda no arquivo de configuração do appServer, na sessão
[General]
, ajuste a chaveBUILDKILLUSERS=1
. - Reinicie a execução do appServer.
- Abra o arquivo
.vscode\launch.json
. - Localize a definição de executor que será utilizada e adicione a chave
"enableMultiThread": true
;
- Encerre todos os serviços e conexões. Dica: Compilar qualquer fonte, encerra todos os serviços e conexões existentes.
- Coloque um ponto de parada que será executado quando o serviço for requisitado.
- Iniciar a depuração executando qualquer função do RPO para que mantenha uma conxão do depurador com o appServer.
Se serviço REST, execute a função
u_startRest
e aguarde a mensagem de serviço inicializado. - Acione o serviço por fora do VS-CODE, por exemplo executando o
SmartClient
, uma requisição (http, rest, etc) - Quando a depuração parar no ponto de parade, prossiga com a depuração normalmente.