Skip to content

GDR 2026.04

Latest

Choose a tag to compare

@github-actions github-actions released this 13 Oct 07:58
· 5 commits to main since this release

Added

  • gdr probe [--json] reports which adapter a target matches with the evidence
    behind the claim (matched symbols, version source, layout fingerprint) and a
    confidence of exact, range or undetected; gdr init <rtos> auto uses it
    only when a single exact answer exists. $gdr_json now exists from
    source gdr.py, so a client can ask before initializing.
  • A VSCode extension under vscode/ consumes the JSON API: it loads GDR into
    the session's own GDB, probes the target, initializes the adapter the user
    confirms, and states precisely why a session cannot host GDR.
  • gdr api snapshot --no-heap drops the heap walk from a snapshot, so a
    client's stop-time refresh can skip the only full-memory traversal among the
    panel verbs.
  • gdr init refuses to register an adapter when the target matches no RTOS
    symbol, instead of answering every later read with empty tables;
    gdr init <rtos> <version> --allow-unverified overrides that for a kernel
    whose symbols were deliberately modified or stripped. An unverified
    registration is recorded on the session and repeated in every API envelope's
    warnings, so a client shows the caveat rather than trusting the reads.
  • The extension gains an RTOS panel in the bottom panel area (one tab per debug
    session): task/object/heap/check cards rendered from the snapshot envelope,
    stop-driven refresh with a generation guard, configurable heap collection
    (gdr.refreshHeaps), JSON snapshot recording for bug reports
    (gdr.recordSnapshotsDir), a transport choice for very large payloads
    (gdr.snapshotTransport), and address navigation into the mcu-debug memory
    viewer.
  • The extension checks GDB's Python at launch instead of at the first stop: a
    generated loader file records present/absent, so a GDB built without
    Python no longer aborts the debug launch, and the panel names the -py3
    binary to use instead.
  • Typed presentation contract for tooling: every list table declares its
    columns (ColumnSpec), carries machine values beside the rendered text and
    names its identity column, so a client can sort, right-align and key rows
    without re-parsing N/A/0x strings. gdr api capabilities reports each
    kind's columns and the configuration that would enable a missing one, and
    gdr api check reports the system verdicts as structured findings.
  • Detail blocks carry a sections view of their consistency verdicts with
    per-row ok/fail/skipped severity; the flat text output is unchanged.
  • gdr reset and gdr init --force replace the active adapter without
    restarting GDB, so switching target or version no longer costs a session.
  • A versioned JSON API for tooling (the IDE plugin): gdr api <verb> prints
    one envelope and $gdr_json / $gdr_json_chunk return it through GDB
    evaluate, with a chunked fallback for payloads larger than one result.
    gdr init --json reports the init outcome as one structured line.
  • <rtos> heap dump [path] draws the heap occupancy bitmap: grey for free
    blocks and one colour per owner. Inline in iTerm2 or Kitty; otherwise a PNG
    (gdr-heap-<rtos>-gen<N>.png). The panel's heap card draws the same map with a
    hover readout.
  • rtt check [scope] [target] runs explicit consistency checks (thread stack/priority,
    timer flag-vs-list membership, current-thread/tick/registry types, heap chain) with
    ok/fail/skipped verdicts and object addresses; unavailable fields report the
    missing symbol, field or config macro instead of guessing. gdr api check now
    covers the RT-Thread system verdicts as well as the heap ones.
  • The check command is singular everywhere: frt checks is now frt check and
    gdr api checks is now gdr api check (both old spellings stay as aliases).
  • The rtt timers table gains a Src column recording registry and/or active-list
    evidence per timer, so a dormant timer and a detached-but-linked one are told apart.
  • <rtos> watch [<kind> | <object> <target>] prints watched kinds (list table)
    or singletons (detail block) on every target stop, reusing the same collectors
    as the commands; <rtos> unwatch drops them and bare <rtos> watch lists the
    set. Like GDB display, not a watchpoint: it never stops the target. Watches
    are session state dropped by gdr reset.
  • Singular object details accept a name, an explicit address or a symbol:
    <rtos> <object> <name-or-address> (and the detail API verb plus
    $gdr_task/$gdr_object) resolve a name first, then match an address
    literal or symbol against live objects, so duplicate-named or nameless
    objects stay reachable by their Addr column.

Changed

  • gdr init --json reports verified and markers, adds a warning when the
    target could not confirm the adapter, and reports refusals as a coded
    error object (the same shape the API envelope uses) instead of a bare
    message string.
  • FreeRTOS HighWater now matches RT-Thread's historical maximum used bytes,
    not remaining bytes; unavailable without retained stack bounds and prefill.
  • FreeRTOS normal views show concrete check problems instead of verified/n/a
    counts; frt check [scope] [name] exposes all verdicts with object addresses.
  • Memory sizes are unified to bytes: key/value sizes print with a B suffix,
    and table columns state bytes in their descriptions rather than in headers.
  • The panel's system summary is one header row and one value row, the task
    table's shape. Kernel version is gone from rtt system and the panel.
  • rtt heap drops the Holes line and the per-thread occupancy table; its
    verdicts move into the table as diagnostic columns. The Checks card is gone
    from the panel. gdr api check stays.
  • A new PC column after BasePrio shows the thread's last PC, proven from
    its saved switch frame or N/A.

Fixed

  • FreeRTOS stack size/usage include the final recorded StackType_t; HighWater
    includes saved-SP reservations so it never falls below Used, even when initial
    context slots retain their fill bytes.
  • Redundant RT-Thread object Type and timer KernelTick columns are omitted from
    merged tables; meaningful timer classes and FreeRTOS subtypes remain available.
  • Snapshots taken at an RT-Thread reset-vector stop no longer fail on NULL
    timer-list links; startup lists stop safely instead of producing fake objects
    at wrapped addresses. Normal collection works after kernel startup.
  • Heap maps preserve every block at a minimum of 6×6 pixels without trailing
    background; exported PNGs include owner/free colour legends and byte totals.
  • RT-Thread heap walk counts used blocks by their full span, matching the
    kernel counters, so HeapAccounting no longer reports a false mismatch.
    rtt heap Holes states its sizes in bytes; the panel's heap table is titled
    by what it lists ("Heap used by thread" or "Free list").
  • The VSCode extension checks Python before source gdr.py at launch. Without
    Python the session still starts and the panel shows why. The first stop does
    not check Python or source again. The source path is unquoted so GDB 16
    accepts it.
  • Version detection reads a kernel's version macros from the loaded image's
    debug strings instead of GDB's compilation-unit scope, so it keeps working when
    the build tree is gone (a flashed release image) or when the halted PC sits in
    a unit that has not included the version header yet.
  • RT-Thread Scheduler state reads the scheduler lock and interrupt nest
    counters: Unlocked, Locked (nest N), or In ISR (nest N). It was always
    N/A; the row is omitted when no counter can be read.