Arquitetura¶
O debugger é um workspace Cargo com três crates, mais o SDK como dependência.
editor (VS Code, DAP)
│ Debug Adapter Protocol (stdio)
▼
dap-adapter ──lança──► servidor SA-MP/open.mp
│ protocolo próprio (NDJSON / socket local) │ carrega
└──────────────────────────────────────────────┤
▼
debug-plugin (dentro da VM)
Crates¶
| Crate | Tipo | Papel |
|---|---|---|
protocol |
lib |
Tipos compartilhados do IPC plugin ↔ adaptador (comandos e eventos em NDJSON sobre socket local). |
debug-plugin |
cdylib |
Carregado pelo servidor. Instala o debug hook, decide pausar (breakpoint/step/erro), coleta variáveis e bloqueia a VM até o editor mandar continuar. |
dap-adapter |
bin |
Traduz DAP ↔ protocolo próprio. Lança o servidor como processo filho (morre junto), repassa breakpoints e eventos. |
SDK compartilhado¶
O parser do formato AMX_DBG (endereço ↔ linha ↔ símbolo ↔ função) e as
primitivas de VM vêm do SDK rust-samp:
samp::debug/samp_sdk::debug— parser do bloco de debug.Amx::cip/frame/stack/heap/stp/pri/alt— registradores da VM.Amx::read_cell/write_cell— dados (inspecionar/editar variáveis).Amx::read_code/Amx::opcode_table— código (decodificar opcodes; ver Pausa no erro).
Usar o SDK como fonte única evita duplicar o parser entre o plugin e o adaptador
(o adaptador depende do rust-samp-sdk com default-features = false, features =
["debug"], só a lógica pura, sem FFI).
Fluxo de uma pausa¶
- A VM chama o debug hook a cada linha (
.amxcompilado com-d3). - O plugin decide pausar (breakpoint/condição/hit-count/step/erro de runtime).
- Coleta as variáveis em escopo e envia um evento ao adaptador.
- Bloqueia a VM (o servidor congela — esperado em dev) até o editor mandar continuar/step.
Compilação¶
- Plugin → arquitetura do servidor (SA-MP/open.mp são 32-bit →
i686-unknown-linux-gnu). - Adaptador → arquitetura do host (onde o editor roda).
- Edição 2024,
resolver = "3".