O PawnPro oferece um depurador visual para gamemodes Pawn (SA-MP / open.mp): breakpoints, step, inspeção de variáveis e call stack, direto no editor.
Alvo: servidor local de desenvolvimento. Ao parar num breakpoint, o servidor congela — isso é o comportamento esperado de um depurador, não um problema.
São duas peças, em processos diferentes:
- Adaptador DAP — vem na extensão; é iniciado automaticamente. Fala com o editor e com o plugin.
- Plugin do servidor — um binário (
.so/.dll) que roda dentro do servidor. Você instala uma vez. O mesmo binário serve SA-MP e open.mp.
Quando você inicia a depuração, a extensão:
- Recompila o gamemode com informação de depuração (
-d3é adicionado automaticamente se você ainda não usa uma flag-d; sua configuração não é alterada). - Verifica se o plugin está instalado e registrado (e avisa se faltar algo).
- Inicia o servidor com as variáveis de depuração e lança o adaptador, que conecta no plugin.
A única ação manual é instalar o plugin no servidor (uma vez).
Baixe da release do PawnPro Debugger:
- Linux:
pawnpro_debug.so - Windows:
pawnpro_debug.dll
O mesmo arquivo funciona em SA-MP e open.mp. A release já publica com o nome correto — não renomeie.
Se preferir compilar (sem release disponível), o binário sai como
libdebug_plugin.so (Linux) / debug_plugin.dll (Windows); aí sim renomeie para
pawnpro_debug.{so,dll} ao instalar:
git clone https://github.com/NullSablex/PawnPro-Debugger
cd PawnPro-Debugger
# Linux (servidor é 32-bit):
rustup target add i686-unknown-linux-gnu
cargo build --release -p debug-plugin --target i686-unknown-linux-gnu
# binário em: target/i686-unknown-linux-gnu/release/libdebug_plugin.soColoque o binário (já chamado pawnpro_debug.so/.dll) na pasta correta:
=== "open.mp (recomendado)"
O plugin é um **componente nativo** do open.mp. Coloque-o na pasta
**`components/`** — o servidor o **descobre automaticamente** no início.
**Nenhum registro no `config.json` é necessário.**
```bash
# Linux
cp pawnpro_debug.so /caminho/do/servidor/components/
# Windows
copy pawnpro_debug.dll C:\caminho\do\servidor\components\
```
=== "open.mp (modo legado)"
Alternativa: coloque em `plugins/` e declare em `pawn.legacy_plugins` no
`config.json`. Prefira o componente acima.
```json
{
"pawn": {
"legacy_plugins": ["pawnpro_debug"]
}
}
```
=== "SA-MP"
Coloque em `plugins/` e adicione à linha `plugins` do `server.cfg`:
```
# plugins/pawnpro_debug.so
plugins pawnpro_debug.so
```
Pronto — isso é feito uma única vez por servidor.
- Abra o gamemode (
.pwn) no editor. - Clique na margem para colocar breakpoints.
- Pressione F5 (ou crie uma configuração
launch.jsondo tipopawn).
A extensão recompila com -d3, verifica o plugin, sobe o servidor e conecta.
Ao atingir um breakpoint, a execução pausa e você vê as variáveis em escopo.
A saída do servidor (incluindo print e logs do gamemode) aparece no painel
Console de Depuração do editor — não é preciso abrir um terminal à parte.
{
"type": "pawn",
"request": "launch",
"name": "Depurar gamemode (PawnPro)",
"program": "${workspaceFolder}/gamemodes/main.amx",
"cwd": "${workspaceFolder}"
}| Campo | Descrição |
|---|---|
program |
Caminho do .amx. O .pwn ao lado é recompilado com debug info. |
cwd |
Diretório de trabalho do servidor (padrão: raiz do workspace). |
session |
Id do canal interno (socket local). Gerado automaticamente se vazio. |
Antes de iniciar, a extensão verifica se o plugin está instalado no local
correto e registrado (quando o servidor exige). Ela também confirma que o
arquivo é mesmo o plugin oficial — se houver outro plugin com o nome
pawnpro_debug que não seja o do depurador, ela avisa do conflito em vez de
prosseguir como se estivesse tudo certo.
Mesmo que você escolha iniciar assim mesmo, a depuração só funciona com o plugin correto: um plugin homônimo não abre o canal de depuração, então o adaptador falha ao conectar com uma mensagem explicando as causas prováveis.
- Alvo é desenvolvimento local. Não é para servidor de produção com jogadores.
- O
.amxprecisa ter sido compilado com-d3(a extensão cuida disso). - Sem hot-reload / edit-and-continue.
- Call stack ainda mostra só o frame atual (não percorre a cadeia de chamadas).