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