udebug-cli: add support for streaming tracing data
authorFelix Fietkau <[email protected]>
Sun, 24 Aug 2025 04:32:57 +0000 (06:32 +0200)
committerFelix Fietkau <[email protected]>
Sun, 24 Aug 2025 05:03:54 +0000 (07:03 +0200)
Signed-off-by: Felix Fietkau <[email protected]>
udebug-cli

index ce80412c4571eace57bb9f8f44ca062bb8d14581..1f59684acf7b5b9aa9520b70b85e444e4b2edf84 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/env ucode
 'use strict';
-import { basename, open, stdout } from "fs";
+import { basename, readlink, open, stdout } from "fs";
 let udebug = require("udebug");
 let uloop = require("uloop");
 let libubus = require("ubus");
@@ -11,6 +11,7 @@ let opts = {
        select: []
 };
 let service_config;
+let trace_config;
 
 const usage_message = `
 Usage: ${basename(sourcepath())} [<options>] <command> [<args>]
@@ -66,6 +67,13 @@ function parse_service_value(svc, option, val)
 
 function parse_service_entry(name, option, val)
 {
+       if (wildcard(name, "kernel:*")) {
+               name = substr(name, 7);
+               trace_config ??= [];
+               push(trace_config, name);
+               return;
+       }
+
        if (index(name, "*") >= 0) {
                for (let svcname, svc in service_config) {
                        if (!wildcard(svcname, name))
@@ -211,6 +219,15 @@ function open_ring(ring, poll) {
        return ring;
 }
 
+function open_trace() {
+       let ring = udebug.trace_ring("udebug-" + readlink("/proc/self"));
+
+       ring.set_file("trace_clock", "tai");
+       ring.set_file("set_event", join("\n", trace_config));
+       ring.set_poll_cb(poll_data);
+       rings.kernel = [ "kernel", ring ];
+}
+
 function open_log_out() {
        let out = opts.output_file;
        if (!opts.output_file || out == "-")
@@ -272,6 +289,9 @@ function stream_data(log) {
                }
        }
 
+       if (trace_config)
+               open_trace();
+
        let done = () => { uloop.end(); };
        signal('SIGINT', done);
        signal('SIGTERM', done);