v0.6.1
Released: 2026-05-13
Republish of v0.6.0 with a smaller VSIX. v0.6.0 was auto-published by the GitHub Actions release workflow on v* tag push, before a .vscodeignore fix excluded a stray local indexing database (.cocoindex_code/) that had been picked up by the packager. v0.6.1 ships the same code with a clean 679 KB VSIX instead of v0.6.0’s 6.4 MB. Prefer v0.6.1. No functional or behavioral differences between the two releases.
Architecture
Section titled “Architecture”- Direct-memory RTT path replaces libjlinkarm’s high-level RTT API. LogScope now reads the SEGGER RTT control block directly via target memory reads (the approach used by probe-rs, OpenOCD, and Nordic’s nrfutil) instead of routing through
JLINK_RTTERMINAL_*. This bypasses libjlinkarm’s host-sidetracked_RdOffcache. - The legacy path remains available via
LOGSCOPE_RTT_LEGACY=1for one-flip rollback if the new path causes regressions.
- Mid-session board resets are now detected and recovered automatically. Pressing the reset button while LogScope is connected no longer leaves the panel stuck on the pre-reset buffer; the helper detects the failed SWD reads, re-attaches the J-Link probe, and surfaces the new boot banner.
- The probe-rs-style
last_written_rd_offdetection pattern is implemented: after the helper writesRdOffto the target, it remembers the value and compares it against the target’sRdOffon the next poll. If they diverge, a target reset has happened and the helper re-attaches without halting the CPU. On hardware where SWD recovers on its own after reset, this is a single-digit-ms path.
Recovery time on Nordic chips (known limitation)
Section titled “Recovery time on Nordic chips (known limitation)”- Hardware testing on the nRF54L15 shows a mid-session reset recovery time of approximately 2.5 to 3 seconds end to end. Empirically the J-Link DLL jams its DAP state during the reset window on this chip and
jlink.connect()alone (withoutclose()first) fails in a few ms with “Unspecified error”. The full sequenceclose() + sleep + open() + connect() + re-attachis required to clear the jam, which sets the floor. The cheap re-init path is still attempted first (free when it fails fast) and on other vendors’ hardware (STM32, SiLabs, TI; untested at v0.6.0) it may succeed, in which case recovery is sub-second. See TODO.md for the optimization follow-ups planned for v0.6.1.
- Channel names from the SEGGER_RTT control block display in the sidebar (for example, “Terminal” instead of “Channel 0”). Names come from the
sNamepointer in each up-buffer descriptor and are re-emitted after every successful re-attach so post-reset firmware updates with different channel names show correctly. - pylink error classification:
JLinkExceptioncodes are now classified as transient (retry via polling), probe-fatal (immediate full reconnect), or target-state (surface; no auto-recovery). Time-based grace (300 ms) before escalating to recovery prevents spurious reconnects on isolated bad reads. - Python test suite at
test/python/covering CB scanning, parsing, ring-buffer math, error classification, and the session state machine. Run vianpm run test:python(41 tests). - CI step runs the Python tests on every PR.
Rollback
Section titled “Rollback”- If you hit a regression, set the
LogScope: Rtt: Legacy ModeVS Code setting totrue(or"logscope.rtt.legacyMode": truein settings.json) to force the oldJLINK_RTTERMINAL_*path. Reload the window for the change to take effect. The environment variableLOGSCOPE_RTT_LEGACY=1also works for command-line use. Please file an issue at https://github.com/NovelBits/logscope/issues with the reproduction details.