Debug remoto TDS-VSCode em producao
Como conectar TDS-VSCode em AppServer producao pra debug sem derrubar sistema. Breakpoints, watch, step-by-step seguro.
Bug aparece so em producao — classico. Debug remoto via TDS-VSCode permite conectar no AppServer real e step-by-step na rotina sem precisar reproduzir localmente. Mas exige cuidado.
Pre-requisitos
- TDS-VSCode instalado (extensao TOTVS)
- Acesso de rede ao AppServer (porta 6717 ou customizada)
- Usuario Protheus com permissao de Developer
- Codigo-fonte sincronizado com o RPO em producao (mesmas versoes)
Configurar conexao
No TDS-VSCode (View → Command Palette → "TOTVS: Add Server"):
{
"name": "Prod-AppServer",
"server": "protheus.empresa.com.br",
"port": 6717,
"id": "prod-debug",
"secure": true,
"environment": "PRODUCAO",
"username": "admin"
}
Conectar e selecionar Environment
- Right-click no servidor → Connect
- Selecionar ambiente PRODUCAO
- Autenticar com usuario/senha (cuidado com cred em prod!)
- Status muda pra "Connected"
Iniciar Debug session
- Abra o fonte da User Function que quer debugar
- Set breakpoint clicando ao lado da linha (red dot)
- F5 ou Run → Start Debugging
- Escolha "TotvsLanguage Debug Server"
- VSCode dispara — agora todas chamadas a essa User Function param no breakpoint
Recursos disponiveis no debug
| Funcao | Atalho |
|---|---|
| Step Over | F10 |
| Step Into | F11 |
| Step Out | Shift+F11 |
| Continue | F5 |
| Watch variavel | Adicionar em "Watch" panel |
| Stack Trace | Painel "Call Stack" |
| Breakpoint condicional | Right-click breakpoint → Edit |
Breakpoint condicional — limitar escopo
// Pegar so quando codigo cliente eh especifico
SC5->C5_CLIENTE == "000123"
// So quando valor > X
M->C5_TOTAL > 100000
// So pra user especifico
RetCodUsr() == "MEUUSER"
Pegadinhas de Debug em producao
- VOCE BLOQUEIA o usuario real. Se um cliente esta usando a rotina e voce parou no breakpoint, ele esta esperando.
- Timeout do SmartClient: usuario pode receber erro "perdeu conexao" se debug ficar parado > 1 min.
- Variaveis sensiveis em Watch: senhas, tokens visiveis na tela. Cuidado com gravacao/print.
- Fonte sincronizado: TDS-VSCode mapeia linha do fonte com bytecode do RPO. Versoes diferentes = breakpoints na linha errada.
- RPO em uso: nao recompile a User Function durante debug — quebra a sessao.
Boas praticas
- Avise o usuario antes de iniciar debug (chat/email)
- Use breakpoint condicional pra filtrar — pegue so a sessao em questao
- Tenha plano B: se debug nao revelar, faca log temporario com FwLogger e remova depois
- Salve transcricao do debug (log, screenshots) — pra documentacao
- Documente bug e fix no Jira/issue tracker
Alternativa: debug log-based
Se debug live e arriscado, instrumente com FwLogger pontual:
User Function MinhaFuncao()
FwLogger():Debug("entrou", {"input": cParametro})
// ... codigo
FwLogger():Debug("antes de SaldoTit", {"valores": aDados})
nSaldo := SaldoTit(...)
FwLogger():Debug("apos SaldoTit", {"saldo": nSaldo})
// ... mais codigo
Return
Apos analisar logs, remova as chamadas DEBUG (deixa em codigo polui).
Cenarios praticos
1. Rotina "nao funciona pra um cliente especifico"
Breakpoint condicional cCliente == "000123". Debug so dispara pra ele.
2. "Aparece erro intermitente"
Breakpoint na linha do erro + watch das variaveis. Quando reproduzir, voce ve o estado.
3. "Quero entender uma rotina TOTVS padrao"
Em fonte legado da TOTVS, breakpoint nao funciona sem fonte. Mas Watch + Call Stack ajudam.