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

Kris Van Hees kris.van.hees at oracle.com
Wed Jun 7 16:32:16 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 | 100 +++++++++++++++++++++++++++++++++++++
 3 files changed, 103 insertions(+), 1 deletion(-)
 create mode 100755 test/utils/clean_probes.sh

diff --git a/runtest.sh b/runtest.sh
index a39a1c91..ff0bc8db 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..338c16fe
--- /dev/null
+++ b/test/utils/clean_probes.sh
@@ -0,0 +1,100 @@
+#!/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 -C dtrace -o pid=
+	echo '==='
+	cat ${EVENTS}
+} | \
+	awk -v tracefs=${TRACEFS} \
+	    'function getTimestamp(dt) {
+		 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(); }
+
+	     /^===/ { re = "^dt_(" substr(pids, 2) ")_"; }
+
+	     !re {
+		 pids = pids "|" int($1);
+		 next;
+	     }
+
+	     $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 "Orphaned kprobe "kpv[i];
+		     print "-:"kpv[i] >> fn;
+		     if (i % 20 == 19)
+			 close(fn);
+		 }
+		 close(fn);
+
+		 fn = tracefs"/uprobe_events";
+		 for (i = 0; i < upc; i++) {
+		     print "Orphaned uprobe "upv[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