xref: /aosp_15_r20/external/bcc/tools/reset-trace.sh (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker#!/bin/bash
2*387f9dfdSAndroid Build Coastguard Worker#
3*387f9dfdSAndroid Build Coastguard Worker# reset-trace - reset state of tracing, disabling all tracing.
4*387f9dfdSAndroid Build Coastguard Worker#               Written for Linux.
5*387f9dfdSAndroid Build Coastguard Worker#
6*387f9dfdSAndroid Build Coastguard Worker# If a bcc tool crashed and you suspect tracing is partially enabled, you
7*387f9dfdSAndroid Build Coastguard Worker# can use this tool to reset the state of tracing, disabling anything still
8*387f9dfdSAndroid Build Coastguard Worker# enabled. Only use this tool in the case of error, and, consider filing a
9*387f9dfdSAndroid Build Coastguard Worker# bcc ticket so we can fix the error.
10*387f9dfdSAndroid Build Coastguard Worker#
11*387f9dfdSAndroid Build Coastguard Worker# bcc-used tracing facilities are reset. Other tracing facilities (ftrace) are
12*387f9dfdSAndroid Build Coastguard Worker# checked, and if not in an expected state, a note is printed. All tracing
13*387f9dfdSAndroid Build Coastguard Worker# files can be reset with -F for force, but this will interfere with any other
14*387f9dfdSAndroid Build Coastguard Worker# running tracing sessions (eg, ftrace).
15*387f9dfdSAndroid Build Coastguard Worker#
16*387f9dfdSAndroid Build Coastguard Worker# USAGE: ./reset-trace [-Fhqv]
17*387f9dfdSAndroid Build Coastguard Worker#
18*387f9dfdSAndroid Build Coastguard Worker# REQUIREMENTS: debugfs mounted on /sys/kernel/debug
19*387f9dfdSAndroid Build Coastguard Worker#
20*387f9dfdSAndroid Build Coastguard Worker# COPYRIGHT: Copyright (c) 2016 Brendan Gregg.
21*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License")
22*387f9dfdSAndroid Build Coastguard Worker#
23*387f9dfdSAndroid Build Coastguard Worker# 20-Jul-2014	Brendan Gregg	Created this.
24*387f9dfdSAndroid Build Coastguard Worker# 18-Oct-2016      "      "     Updated for bcc use.
25*387f9dfdSAndroid Build Coastguard Worker
26*387f9dfdSAndroid Build Coastguard Workertracing=/sys/kernel/debug/tracing
27*387f9dfdSAndroid Build Coastguard Workeropt_force=0; opt_verbose=0; opt_quiet=0
28*387f9dfdSAndroid Build Coastguard Worker
29*387f9dfdSAndroid Build Coastguard Workerfunction usage {
30*387f9dfdSAndroid Build Coastguard Worker	cat <<-END >&2
31*387f9dfdSAndroid Build Coastguard Worker	USAGE: reset-trace [-Fhqv]
32*387f9dfdSAndroid Build Coastguard Worker	                 -F             # force: reset all tracing files
33*387f9dfdSAndroid Build Coastguard Worker	                 -v             # verbose: print details while working
34*387f9dfdSAndroid Build Coastguard Worker	                 -h             # this usage message
35*387f9dfdSAndroid Build Coastguard Worker	                 -q             # quiet: no output
36*387f9dfdSAndroid Build Coastguard Worker	  eg,
37*387f9dfdSAndroid Build Coastguard Worker	       reset-trace              # disable semi-enabled tracing
38*387f9dfdSAndroid Build Coastguard WorkerEND
39*387f9dfdSAndroid Build Coastguard Worker	exit
40*387f9dfdSAndroid Build Coastguard Worker}
41*387f9dfdSAndroid Build Coastguard Worker
42*387f9dfdSAndroid Build Coastguard Workerfunction die {
43*387f9dfdSAndroid Build Coastguard Worker	echo >&2 "$@"
44*387f9dfdSAndroid Build Coastguard Worker	exit 1
45*387f9dfdSAndroid Build Coastguard Worker}
46*387f9dfdSAndroid Build Coastguard Worker
47*387f9dfdSAndroid Build Coastguard Workerfunction vecho {
48*387f9dfdSAndroid Build Coastguard Worker	(( ! opt_verbose )) && return
49*387f9dfdSAndroid Build Coastguard Worker	echo "$@"
50*387f9dfdSAndroid Build Coastguard Worker}
51*387f9dfdSAndroid Build Coastguard Worker
52*387f9dfdSAndroid Build Coastguard Workerfunction writefile {
53*387f9dfdSAndroid Build Coastguard Worker	file=$1
54*387f9dfdSAndroid Build Coastguard Worker	write=$2
55*387f9dfdSAndroid Build Coastguard Worker	if [[ ! -w $file ]]; then
56*387f9dfdSAndroid Build Coastguard Worker		echo >&2 "WARNING: file $file not writable/exists. Skipping."
57*387f9dfdSAndroid Build Coastguard Worker		return
58*387f9dfdSAndroid Build Coastguard Worker	fi
59*387f9dfdSAndroid Build Coastguard Worker
60*387f9dfdSAndroid Build Coastguard Worker	vecho "Checking $PWD/$file"
61*387f9dfdSAndroid Build Coastguard Worker        contents=$(grep -v '^#' $file)
62*387f9dfdSAndroid Build Coastguard Worker	if [[ "$contents" != "$expected" ]]; then
63*387f9dfdSAndroid Build Coastguard Worker		(( ! opt_quiet )) && echo "Needed to reset $PWD/$file"
64*387f9dfdSAndroid Build Coastguard Worker		vecho "$file, before (line enumerated):"
65*387f9dfdSAndroid Build Coastguard Worker		(( opt_verbose )) && cat -nv $file
66*387f9dfdSAndroid Build Coastguard Worker		cmd="echo $write > $file"
67*387f9dfdSAndroid Build Coastguard Worker		if ! eval "$cmd"; then
68*387f9dfdSAndroid Build Coastguard Worker			echo >&2 "WARNING: command failed \"$cmd\"." \
69*387f9dfdSAndroid Build Coastguard Worker			    "bcc still running? Continuing."
70*387f9dfdSAndroid Build Coastguard Worker		fi
71*387f9dfdSAndroid Build Coastguard Worker		vecho "$file, after (line enumerated):"
72*387f9dfdSAndroid Build Coastguard Worker		(( opt_verbose )) && cat -nv $file
73*387f9dfdSAndroid Build Coastguard Worker		vecho
74*387f9dfdSAndroid Build Coastguard Worker	fi
75*387f9dfdSAndroid Build Coastguard Worker}
76*387f9dfdSAndroid Build Coastguard Worker
77*387f9dfdSAndroid Build Coastguard Worker# only write when force is used
78*387f9dfdSAndroid Build Coastguard Workerfunction checkfile {
79*387f9dfdSAndroid Build Coastguard Worker	file=$1
80*387f9dfdSAndroid Build Coastguard Worker	write=$2
81*387f9dfdSAndroid Build Coastguard Worker	expected=$3
82*387f9dfdSAndroid Build Coastguard Worker	if [[ ! -e $file ]]; then
83*387f9dfdSAndroid Build Coastguard Worker		echo >&2 "WARNING: file $file doesn't exist. Skipping."
84*387f9dfdSAndroid Build Coastguard Worker		return
85*387f9dfdSAndroid Build Coastguard Worker	fi
86*387f9dfdSAndroid Build Coastguard Worker	if (( opt_force )); then
87*387f9dfdSAndroid Build Coastguard Worker		writefile $file $write
88*387f9dfdSAndroid Build Coastguard Worker		return
89*387f9dfdSAndroid Build Coastguard Worker	fi
90*387f9dfdSAndroid Build Coastguard Worker	(( opt_quiet )) && return
91*387f9dfdSAndroid Build Coastguard Worker
92*387f9dfdSAndroid Build Coastguard Worker	vecho "Checking $PWD/$file"
93*387f9dfdSAndroid Build Coastguard Worker        contents=$(grep -v '^#' $file)
94*387f9dfdSAndroid Build Coastguard Worker	if [[ "$contents" != "$expected" ]]; then
95*387f9dfdSAndroid Build Coastguard Worker		echo "Noticed unrelated tracing file $PWD/$file isn't set as" \
96*387f9dfdSAndroid Build Coastguard Worker		    "expected. Not resetting (-F to force, -v for verbose)."
97*387f9dfdSAndroid Build Coastguard Worker		vecho "Contents of $file is (line enumerated):"
98*387f9dfdSAndroid Build Coastguard Worker		(( opt_verbose )) && cat -nv $file
99*387f9dfdSAndroid Build Coastguard Worker		vecho "Expected \"$expected\"."
100*387f9dfdSAndroid Build Coastguard Worker	fi
101*387f9dfdSAndroid Build Coastguard Worker}
102*387f9dfdSAndroid Build Coastguard Worker
103*387f9dfdSAndroid Build Coastguard Worker### process options
104*387f9dfdSAndroid Build Coastguard Workerwhile getopts Fhqv opt
105*387f9dfdSAndroid Build Coastguard Workerdo
106*387f9dfdSAndroid Build Coastguard Worker	case $opt in
107*387f9dfdSAndroid Build Coastguard Worker	F)	opt_force=1 ;;
108*387f9dfdSAndroid Build Coastguard Worker	q)	opt_quiet=1 ;;
109*387f9dfdSAndroid Build Coastguard Worker	v)	opt_verbose=1 ;;
110*387f9dfdSAndroid Build Coastguard Worker	h|?)	usage ;;
111*387f9dfdSAndroid Build Coastguard Worker	esac
112*387f9dfdSAndroid Build Coastguard Workerdone
113*387f9dfdSAndroid Build Coastguard Workershift $(( $OPTIND - 1 ))
114*387f9dfdSAndroid Build Coastguard Worker
115*387f9dfdSAndroid Build Coastguard Worker### reset tracing state
116*387f9dfdSAndroid Build Coastguard Workervecho "Resetting tracing state..."
117*387f9dfdSAndroid Build Coastguard Workervecho
118*387f9dfdSAndroid Build Coastguard Workercd $tracing || die "ERROR: accessing tracing. Root user? /sys/kernel/debug?"
119*387f9dfdSAndroid Build Coastguard Worker
120*387f9dfdSAndroid Build Coastguard Worker# files bcc uses
121*387f9dfdSAndroid Build Coastguard Workerwritefile kprobe_events "" ""
122*387f9dfdSAndroid Build Coastguard Workerwritefile uprobe_events "" ""
123*387f9dfdSAndroid Build Coastguard Workerwritefile trace "" ""         # clears trace_pipe
124*387f9dfdSAndroid Build Coastguard Worker
125*387f9dfdSAndroid Build Coastguard Worker# non-bcc files
126*387f9dfdSAndroid Build Coastguard Workercheckfile current_tracer nop nop
127*387f9dfdSAndroid Build Coastguard Workercheckfile set_ftrace_filter "" ""
128*387f9dfdSAndroid Build Coastguard Workercheckfile set_graph_function "" ""
129*387f9dfdSAndroid Build Coastguard Workercheckfile set_ftrace_pid "" "no pid"
130*387f9dfdSAndroid Build Coastguard Workercheckfile events/enable 0 0
131*387f9dfdSAndroid Build Coastguard Workercheckfile tracing_thresh 0 0
132*387f9dfdSAndroid Build Coastguard Workercheckfile tracing_on 1 1
133*387f9dfdSAndroid Build Coastguard Worker
134*387f9dfdSAndroid Build Coastguard Workervecho
135*387f9dfdSAndroid Build Coastguard Workervecho "Done."
136