[DTrace-devel] [PATCH] test: clean up orphaned tracing events between tests

Kris Van Hees kris.van.hees at oracle.com
Wed Jun 7 03:36:19 UTC 2023


Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 runtest.sh                 |   2 +
 test/utils/Build           |   2 +-
 test/utils/clean_probes.sh | 102 +++++++++++++++++++++++++++++++++++++
 3 files changed, 105 insertions(+), 1 deletion(-)
 create mode 100755 test/utils/clean_probes.sh

diff --git a/runtest.sh b/runtest.sh
index a39a1c91..17589d85 100755
--- a/runtest.sh
+++ b/runtest.sh
@@ -1500,6 +1500,8 @@ for dt in $dtrace; do
             cp -f $tmpdir/test.out $base.r
         fi
 
+	test/utils/clean_probes.sh >> $LOGFILE
+
         log "\n"
 
         if [[ -n $regression ]]; then
diff --git a/test/utils/Build b/test/utils/Build
index 36f8d6a4..1398822b 100644
--- a/test/utils/Build
+++ b/test/utils/Build
@@ -4,7 +4,7 @@
 # http://oss.oracle.com/licenses/upl.
 
 TEST_UTILS = baddof badioctl workload_kernel workload_user showUSDT print-stack-layout
-TEST_SCRIPTS = check_result.sh cpc_get_events.sh cpc_temp_skip_bug.sh perf_count_event.sh workload_analyze_loop.sh workload_get_iterations.sh
+TEST_SCRIPTS = check_result.sh clean_probes.sh cpc_get_events.sh cpc_temp_skip_bug.sh perf_count_event.sh workload_analyze_loop.sh workload_get_iterations.sh
 
 define test-util-template
 CMDS += $(1)
diff --git a/test/utils/clean_probes.sh b/test/utils/clean_probes.sh
new file mode 100755
index 00000000..5e931232
--- /dev/null
+++ b/test/utils/clean_probes.sh
@@ -0,0 +1,102 @@
+#!/usr/bin/bash
+
+TRACEFS=/sys/kernel/debug/tracing
+EVENTS=${TRACEFS}/available_events
+KPROBES=${TRACEFS}/kprobe_events
+UPROBES=${TRACEFS}/uprobe_events
+
+# Check permissions
+if [ ! -r ${EVENTS} ]; then
+	echo "ERROR: Cannot read ${EVENTS}" > /dev/stderr
+	exit 1
+elif [ ! -w ${KPROBES} ]; then
+	echo "ERROR: Cannot write to ${KPROBES}" > /dev/stderr
+	exit 1
+elif [ ! -w ${UPROBES} ]; then
+	echo "ERROR: Cannot write to ${UPROBES}" > /dev/stderr
+	exit 1
+fi
+
+# Scan the list of events for any orphaned DTrace probes
+(
+	ps -e
+	cat ${EVENTS}
+) | \
+	awk -v tracefs=${TRACEFS} \
+	    'function getTimestamp(dt) {
+#		 cmd = "date --rfc-3339=ns";
+		 cmd = "date +\"%s.%N\"";
+		 cmd | getline dt;
+		 close(cmd);
+		 return dt;
+	     }
+
+	     function timeDiff(t0, t1, s0, n0, s1, n1) {
+		 tmp = $0;
+
+		 $0 = t0;
+		 sub(/\./, " ");
+		 s0 = int($1);
+		 n0 = int($2);
+		 $0 = t1;
+		 sub(/\./, " ");
+		 s1 = int($1);
+		 n1 = int($2);
+
+		 if (n1 < n0) {
+		     s1--;
+		     n1 += 1000000000;
+		 }
+
+		 $0 = tmp;
+
+		 return sprintf("%d.%09d", s1 - s0, n1 - n0);
+	     }
+
+	     BEGIN { start = getTimestamp(); }
+
+	     NF > 1 {
+		 if (/dtrace/)
+		     pids = pids "|" int($1);
+		 next;
+	     }
+
+	     !processing {
+		 re = "^dt_" substr(pids, 2) "_";
+		 processing = 1;
+	     }
+
+	     $1 !~ /^dt_[0-9]/ { next; }
+	     $1 ~ re { next; }
+	     { sub(/:/, "/"); }
+
+	     {
+		 if (/_fbt_/)
+		     kpv[kpc++] = $0;
+		 else
+		     upv[upc++] = $0;
+	     }
+
+	     END {
+		 fn = tracefs"/kprobe_events";
+		 for (i = 0; i < kpc; i++) {
+		     print "-:"kpv[i] >> fn;
+		     if (i % 20 == 19)
+			 close(fn);
+		 }
+		 close(fn);
+
+		 fn = tracefs"/uprobe_events";
+		 for (i = 0; i < upc; i++) {
+		     print "-:"upv[i] >> fn;
+		     if (i % 20 == 19)
+			 close(fn);
+		 }
+		 close(fn);
+
+		 diff = timeDiff(start, getTimestamp());
+		 txt = sprintf(" (%d kprobes, %d uprobes)", kpc, upc);
+		 print "Cleaning took " diff txt;
+	     }'
+
+exit 0
-- 
2.40.1




More information about the DTrace-devel mailing list