7.6 KiB
7.6 KiB
MARTe2 Debug Suite Specifications
Version: 2.0 Status: Active / Implemented
1. Executive Summary
This project implements a "Zero-Code-Change" observability and debugging layer for the MARTe2 real-time framework. Developers can trace, force, and monitor any signal in a running MARTe2 application without modifying existing source code.
The suite ships two interchangeable transport backends sharing a common abstract interface:
DebugService— TCP command channel + binary UDP telemetry +TcpLoggersidecar. Paired with a native Rust/egui GUI.WebDebugService— HTTP command endpoint + Server-Sent Events telemetry, with an embedded single-page browser UI. No additional client software required.
2. System Architecture
DebugServiceI(Abstract Interface): Singleton that decouples the broker injection layer from the transport. Defined inDebugServiceI.h.DebugService(TCP/UDP Transport): TCP text command channel (port 8080), binary UDP telemetry (port 8081),TcpLoggerlog sidecar (port 8082).WebDebugService(HTTP/SSE Transport): Single HTTP port (default 8090) serving the embedded web UI, command API, and SSE telemetry stream.DebugBrokerWrapper(Injection Layer): C++ template wrappers injected via registry patching. Depend only onDebugServiceI; transport-agnostic.TcpLogger(Log Sidecar): Optional standalone component forwardingREPORT_ERRORevents to TCP clients on a dedicated port (used withDebugServiceonly).
3. Requirements
3.1 Functional Requirements (FR)
- FR-01 (Discovery): Discover the full MARTe2 object hierarchy at runtime. The client SHALL request the full application tree and display it hierarchically.
- FR-02 (Telemetry): Stream high-frequency signal data (verified > 100 Hz) to a remote
client.
DebugServiceuses binary UDP;WebDebugServiceuses SSE. - FR-03 (Forcing): Allow manual override of signal values in memory during execution. The override SHALL persist across RT cycles until explicitly released.
- FR-04 (Logs): Forward all
REPORT_ERRORevents to a connected client in real time.DebugServiceusesTcpLoggeron a dedicated TCP port.WebDebugServiceembeds logs in the SSE stream. - FR-05 (Log Filtering): The client SHOULD support filtering log output by level and by content.
- FR-06 (Execution Control): Provide pause and resume for all patched RT threads, allowing static inspection of the system state.
- FR-07 (Breakpoints): Halt execution when a signal crosses a threshold. Supported
operators:
>,<,==,>=,<=,!=. - FR-08 (Execution Stepping): After a pause or breakpoint, allow resuming for exactly N output-broker cycles then pausing again. Optional per-thread filter.
- FR-09 (Decoupled Tracing): Activating a trace SHALL only stream data; displaying the data (plot, sidebar) is the client's responsibility.
- FR-10 (Signal Monitoring): Poll any
DataSourceIsignal at a configurable period without requiring that signal to be traced at full RT rate. - FR-11 (Config Awareness): The service SHALL accept and store a full copy of the
application's CDB (
SetFullConfig).INFOandDISCOVERresponses SHALL be enriched with additional metadata fields from this CDB. - FR-12 (Config Serving): Provide a
CONFIGcommand returning the full stored configuration as JSON. - FR-13 (MARTe2 Messaging): Allow sending
Messageobjects to any ORD object via anMSGcommand. - FR-14 (Dual Transport): Both
DebugServiceandWebDebugServiceSHALL implement the identicalDebugServiceIinterface and be mutually exclusive singletons. Switching transport SHALL require only a config change (different class name, different port). - FR-15 (Embedded Web UI):
WebDebugServiceSHALL serve a self-contained single-page application with real-time plotting (Chart.js), signal tree, force/break/monitor dialogs, and an integrated log viewer — without any external server or build tooling.
3.2 Technical Constraints (TC)
- TC-01: No modifications allowed to the MARTe2 core library or component source code.
- TC-02: Instrumentation MUST use runtime class registry patching (
ClassRegistryDatabase). - TC-03: RT-path methods (
ProcessSignal,IsPaused) MUST be lock-free or use onlyFastPollingMutexSem; no heap allocation on the RT path. - TC-04:
DebugServicetelemetry MUST use UDP to minimise jitter impact. - TC-05: No STL — use
Vec<T>andStreamStringthroughout. - TC-06: C++98 compatibility for all source files (no
auto, no range-for, no raw string literals). - TC-07: The
DebugServiceIabstract interface MUST be the only dependency ofDebugBrokerWrapper. Concrete transport headers MUST NOT be included by broker code.
4. Performance Requirements
- Latency:
ProcessSignaloverhead < 5 µs per signal when tracing is inactive. - Throughput: Support > 100 Hz signal tracing with zero sample loss on local networks (UDP transport).
- Scalability: Handle up to 4096 unique signals.
- Ring buffer size:
TraceRingBufferinitialised to 4 MB in both transports. - SSE clients:
WebDebugServicesupports up to 8 simultaneous SSE clients. - TCP rate limit: Server disconnects clients sending > 100 commands/s.
- VALUE output cap:
GetSignalValuereturns at most 256 elements per call.
5. Performance Hardening Log
| Fix | Category | Description |
|---|---|---|
| #1 | Naming | STREAMER_MTU = 1400, STREAMER_BUFFER_SIZE = 4096 replace magic numbers |
| #2 | Concurrency | tracePushMutex serialises multi-producer TraceRingBuffer::Push() |
| #3 | Concurrency | Break indices copied under activeMutex; condition evaluated outside lock |
| #4 | Concurrency | Atomic::Add for lock-free per-signal decimation counter |
| #5 | Robustness | TraceRingBuffer::Pop skips corrupt entry; full discard only when unrecoverable |
| #6 | Security | TCP command rate-limit: > 100 cmd/s → client disconnect |
| #7 | Latency | Vec::Swap inside spinlock; deallocation outside — shorter lock hold time |
| #8 | Robustness | 30-second idle timeout on active TCP client |
| #9 | Safety | VALUE output capped at 256 elements; "truncated":true flag included |
| #10 | Correctness | inputBuffer reassembles split TCP commands; bounded at 8 KiB |
| #11 | Correctness | Initialise() never calls MoveToRoot() on the framework-supplied CDB |
6. Command Protocol Summary
| Command | Transport | Description |
|---|---|---|
DISCOVER |
Both | Full signal list with metadata |
TREE |
Both | Live ORD hierarchy as JSON |
INFO <path> |
Both | Node metadata enriched from CDB |
LS [path] |
Both | Immediate children of ORD node |
TRACE <name> <0|1> [dec] |
Both | Enable/disable signal tracing |
FORCE <name> <value> |
Both | Persistent signal value injection |
UNFORCE <name> |
Both | Remove forced value |
BREAK <name> <op> <thr> |
Both | Set conditional breakpoint |
BREAK <name> OFF |
Both | Clear breakpoint |
PAUSE |
Both | Halt all RT threads |
RESUME |
Both | Release paused RT threads |
STEP <n> [thread] |
Both | Run N cycles then pause |
STEP_STATUS |
Both | Query pause/step state |
VALUE <name> |
Both | Read current signal value |
MONITOR SIGNAL <name> <ms> |
Both | Register slow-rate polling |
UNMONITOR SIGNAL <name> |
Both | Stop slow-rate polling |
CONFIG |
Both | Full CDB as JSON |
MSG <obj> <fn> [k=v …] |
Both | Send MARTe2 Message |
SERVICE_INFO |
Both | Transport metadata |