Brendan Gregg | 72027c1 | 2016-10-19 18:48:17 -0700 | [diff] [blame] | 1 | #!/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 | |
| 26 | tracing=/sys/kernel/debug/tracing |
| 27 | opt_force=0; opt_verbose=0; opt_quiet=0 |
| 28 | |
| 29 | function 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 |
| 38 | END |
| 39 | exit |
| 40 | } |
| 41 | |
| 42 | function die { |
| 43 | echo >&2 "$@" |
| 44 | exit 1 |
| 45 | } |
| 46 | |
| 47 | function vecho { |
| 48 | (( ! opt_verbose )) && return |
| 49 | echo "$@" |
| 50 | } |
| 51 | |
| 52 | function 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 |
| 78 | function 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" \ |
| 96 | "expected. Not reseting (-F to force, -v for verbose)." |
| 97 | vecho "Contents of $file is (line enumerated):" |
| 98 | (( opt_verbose )) && cat -nv $file |
| 99 | vecho "Expected \"$expected\"." |
| 100 | fi |
| 101 | } |
| 102 | |
| 103 | ### process options |
| 104 | while getopts Fhqv opt |
| 105 | do |
| 106 | case $opt in |
| 107 | F) opt_force=1 ;; |
| 108 | q) opt_quiet=1 ;; |
| 109 | v) opt_verbose=1 ;; |
| 110 | h|?) usage ;; |
| 111 | esac |
| 112 | done |
| 113 | shift $(( $OPTIND - 1 )) |
| 114 | |
| 115 | ### reset tracing state |
| 116 | vecho "Reseting tracing state..." |
| 117 | vecho |
| 118 | cd $tracing || die "ERROR: accessing tracing. Root user? /sys/kernel/debug?" |
| 119 | |
| 120 | # files bcc uses |
| 121 | writefile kprobe_events "" "" |
| 122 | writefile uprobe_events "" "" |
| 123 | writefile trace "" "" # clears trace_pipe |
| 124 | |
| 125 | # non-bcc files |
| 126 | checkfile current_tracer nop nop |
| 127 | checkfile set_ftrace_filter "" "" |
| 128 | checkfile set_graph_function "" "" |
| 129 | checkfile set_ftrace_pid "" "no pid" |
| 130 | checkfile events/enable 0 0 |
| 131 | checkfile tracing_thresh 0 0 |
| 132 | checkfile tracing_on 1 1 |
| 133 | |
| 134 | vecho |
| 135 | vecho "Done." |