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