File: clean_probes.sh

package info (click to toggle)
dtrace 2.0.5-1
  • links: PTS
  • area: main
  • in suites: sid
  • size: 24,408 kB
  • sloc: ansic: 61,247; sh: 17,997; asm: 1,717; lex: 947; awk: 754; yacc: 695; perl: 37; sed: 17; makefile: 15
file content (101 lines) | stat: -rwxr-xr-x 1,905 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/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}
} | \
	gawk -v kfn=${KPROBES} -v ufn=${UPROBES} \
	    '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) ")_";
		 next;
	     }

	     !re {
		 pids = pids "|" int($1);
		 next;
	     }

	     $1 !~ /^dt_[0-9]/ { next; }
	     $1 ~ re { next; }
	     { sub(/:/, "/"); }

	     {
		 if (/_(raw)?fbt_/)
		     kpv[kpc++] = $0;
		 else
		     upv[upc++] = $0;
	     }

	     END {
		 for (i = 0; i < kpc; i++) {
		     print "Orphaned kprobe "kpv[i];
		     print "-:"kpv[i] >> kfn;
		     if (i % 20 == 19)
			 close(kfn);
		 }
		 close(kfn);

		 for (i = 0; i < upc; i++) {
		     print "Orphaned uprobe "upv[i];
		     print "-:"upv[i] >> ufn;
		     if (i % 20 == 19)
			 close(ufn);
		 }
		 close(ufn);

		 diff = timeDiff(start, getTimestamp());
		 txt = sprintf(" (%d kprobes, %d uprobes)", kpc, upc);
		 print "Cleaning took " diff txt;
	     }'

exit 0