feat: recursos do debugger (call stack, data breakpoints, erros de runtime, inspeção de arrays/strings) - #17
Open
NullSablex wants to merge 15 commits into
Open
feat: recursos do debugger (call stack, data breakpoints, erros de runtime, inspeção de arrays/strings)#17NullSablex wants to merge 15 commits into
NullSablex wants to merge 15 commits into
Conversation
The CodeQL default setup only analysed a pull request when it touched files relevant to the configured languages, so a docs-only PR produced no analysis while master still carried one per language, leaving the code_scanning branch rule unable to diff the two sides. Also add the CODEOWNERS file this repository was missing, so the branch ruleset can require code owner review like the sibling repositories do.
Traz o lookup_function do bloco de debug (base para a pilha de chamadas), Amx::exec_public_scope e o hardening de buffer/stack no FFI. Eventos do SDK (#[event]) são x86-only e viram no-op no check aarch64.
Caminha a cadeia de frames do AMX (FRM anterior + endereço de retorno, parando no público de entrada) e expõe N frames ao editor. Cada frame traz nome da função (lookup_function), linha e variáveis em escopo — reaproveitando inspect::collect por frame. - protocolo: Event::Paused passa a carregar frames: Vec<Frame>; Command:: SetVariable ganha o índice do frame. - plugin: novo módulo stack (walker puro e testável) + build_frames no on_pause; PAUSE_CTX guarda o contexto de todos os frames para editar no frame certo. - adaptador: stackTrace com N frames + source; scopes/variables/evaluate/ setVariable operam por frame (frameId/variablesReference). Cobertura: 6 testes do walker + 2 do plumbing do adaptador. aarch64 ok.
NullSablex
force-pushed
the
feat/recursos-faltantes
branch
from
August 31, 2026 06:37
21d63db to
fb86df3
Compare
Observa variáveis (globais e locais) e pausa na primeira linha após o valor
mudar. Reusa o hook por linha; watches de locais expiram quando o frame dono
retorna (via stack::walk), evitando observar slot de pilha reusado.
- protocolo: Command::SetDataBreakpoints { watches: Vec<DataWatch{frame,name}> }.
- plugin: control::DataWatch + check_data_watches (puro, com expiração por frame
vivo); hook resolve frame+nome → endereço/classe/valor inicial e checa a cada
linha, pausando com reason "data breakpoint".
- adaptador: capability supportsDataBreakpoints; dataBreakpointInfo (dataId
"frame:name") e setDataBreakpoints encaminhando ao plugin.
Cobertura: 5 testes do controlador (mudança/expiração/global) + 3 do adaptador
(parse_data_id, encaminhamento, capability). aarch64 ok.
Traz o accessor hlw() (fundo do heap) necessário para detectar heap underflow. Aponta para a branch do PR NullSablex/rust-samp#54; re-pinar no master estável quando o PR mergear, antes de fechar este.
Estende o simulador de linha (runtime_error) para rastrear stk/hea/hlw/stp e detectar, antes do abort da VM e com as MESMAS condições do amx.c: - STACKERR: colisão pilha/heap (CHKMARGIN, hea+STKMARGIN>stk), inclusive antecipando o PROC do chamado num call (recursão infinita). - HEAPLOW: underflow de heap (CHKHEAP, hea<hlw). - MEMACCESS: endereço na lacuna [hea,stk) ou >=stp (VERIFYADDRESS). Conservador por construção: as checagens só rodam enquanto stk/hea (e o registrador de endereço) são rastreados exatamente; qualquer desvio/opcode não modelado (call, jump, sysreq, sctrl, aritmética) as desliga — nunca um falso-positivo. Números de opcode e condições conferidos no amx.c do omp-compiler. Mensagens localizadas nos 5 idiomas. Cobertura: +6 testes (colisão em stack/call, heaplow, memaccess na lacuna, endereço desconhecido não acusa, barreira pós-call). aarch64 ok.
O PR NullSablex/rust-samp#54 (Amx::hlw) foi mergeado; sai da branch do PR e aponta para o master estável do fork.
NullSablex
marked this pull request as ready for review
August 31, 2026 08:19
…cluídos Alinha docs/features.md e docs/runtime-errors.md ao que o PR entrega (estavam como 'planejado'/'em avaliação'). Adiciona STACKERR/HEAPLOW/MEMACCESS à tabela de erros com as condições fiéis ao amx.c.
Arrays viram expansíveis na árvore de variáveis (elementos como filhos com variablesReference próprio) e arrays de char são mostrados como string; editar um elemento (arr[i]) passa a ser suportado. - protocolo: Var ganha children (elementos); Command::SetVariable ganha index opcional (elemento do array). - plugin: inspect::build_array lê os elementos (até 256) e detecta string (imprimível até terminador 0, Latin-1); hook::set_variable escreve arr[index]. - adaptador: variablesReference codifica (frame, var) para expandir arrays e editar elementos; dataBreakpointInfo passa a recusar arrays por terem filhos. Cobertura: as_string (detecção/conservadorismo), encode/decode de ref de array, parse de índice. 77 testes; clippy pedantic, fmt, aarch64 ok.
evaluate passa a avaliar expressões, não só o nome exato: literais, variáveis, elementos de array (arr[i], índice pode ser subexpressão) e A OP B com + - * / % (aritmética inteira estilo Pawn, ou float) e == != < > <= >= (comparação). Um operador por expressão, conservador — o que não avalia vira falha (o editor mostra 'não disponível'). Novo módulo expr no adaptador, puro e testável (11 testes).
O editor passa a controlar a pausa em erros de runtime via exceptionBreakpoint
Filters/setExceptionBreakpoints. Desligado, a VM aborta normalmente sem pausar.
- protocolo: Command::SetExceptionFilter { runtime }.
- plugin: flag atômica RUNTIME_ERRORS (ligada por padrão) que porteia o
detect_runtime_error no on_break.
- adaptador: capability exceptionBreakpointFilters + handler setExceptionBreakpoints.
Cobertura: encaminhamento liga/desliga + capability. 85 testes.
Traz function_address (nome->endereço de entrada) para os breakpoints de função. Aponta para a branch do PR NullSablex/rust-samp#55; re-pinar no master quando mergear, antes de fechar este.
setFunctionBreakpoints resolve cada nome no endereço de entrada da função (AmxDbg::function_address) e o une aos breakpoints de linha no conjunto único do plugin. Capability supportsFunctionBreakpoints. Útil para callbacks (OnPlayerConnect etc.) sem procurar a linha. Cobertura: resolução + união linha/função + capability. 87 testes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Recursos do debugger acumulados nesta branch, um commit por recurso concluído. Todos validados; docs alinhadas.
Base / dependência
chore: re-pin rust-samp SDKno master estável do fork (incluiAmx::hlw, PR do fork #54 mergeado).Recursos
amx.c, conservadores.arr[i]).Validação
Docs
README.md,docs/features.mdedocs/runtime-errors.mdatualizados para o que a branch entrega.