Demonstrations of reset-trace, for Linux bcc/BPF. You will probably never need this tool. If you kill -9 a bcc tool (plus other signals, like SIGTERM), or if a bcc tool crashes, then kernel tracing can be left in a semi-enabled state. It's not as bad as it sounds: there may just be overhead for writing to ring buffers that are never read. This tool can be used to clean up the tracing state, and reset and disable active tracing. WARNING: Make sure no other tracing sessions are active, as it will likely stop them from functioning (perhaps ungracefully). This specifically clears the state in at least the following files in /sys/kernel/debug/tracing: kprobe_events, uprobe_events, trace_pipe. Other tracing facilities (ftrace) are checked, and if not in an expected state, a note is printed. All tracing files can be reset with -F for force, but this will interfere with any other running tracing sessions (eg, ftrace). Here's an example: # ./reset-trace.sh # That's it. You can use -v to see what it does: # ./reset-trace.sh -v Resetting tracing state... Checking /sys/kernel/debug/tracing/kprobe_events Checking /sys/kernel/debug/tracing/uprobe_events Checking /sys/kernel/debug/tracing/trace Checking /sys/kernel/debug/tracing/current_tracer Checking /sys/kernel/debug/tracing/set_ftrace_filter Checking /sys/kernel/debug/tracing/set_graph_function Checking /sys/kernel/debug/tracing/set_ftrace_pid Checking /sys/kernel/debug/tracing/events/enable Checking /sys/kernel/debug/tracing/tracing_thresh Checking /sys/kernel/debug/tracing/tracing_on Done. In this example, no resetting was necessary. Here's an example of actually needing it: # ./funccount 'bash:r*' Tracing 317 functions for "bash:r*"... Hit Ctrl-C to end. ^C FUNC COUNT rl_free_undo_list 1 rl_deprep_terminal 1 readline_internal_teardown 1 rl_on_new_line 1 rl_crlf 1 rl_clear_signals 1 rl_prep_terminal 1 rl_reset_line_state 1 rl_initialize 1 rl_newline 1 readline_internal_setup 1 rl_set_screen_size 1 readline 1 rl_set_signals 1 rl_expand_prompt 1 replace_history_data 1 rl_set_prompt 1 rl_add_undo 1 rl_insert_text 2 rl_insert 2 rl_redisplay 3 rl_read_key 3 rl_getc 3 readline_internal_char 3 restore_parser_state 6 reap_dead_jobs 6 reset_parser 6 restore_input_line_state 6 realloc 7 read_octal 10 read_tty_modified 13 run_exit_trap 13 redirection_expand 13 restore_pipestatus_array 18 reader_loop 20 run_return_trap 21 remember_args 25 reset_signal_handlers 30 remove_quoted_escapes 60 run_unwind_frame 102 reset_terminating_signals 125 restore_original_signals 139 reset_internal_getopt 405 run_debug_trap 719 read_command 940 remove_quoted_nulls 1830 run_pending_traps 3207 ^C ^C ^C I've traced 317 functions using funccount, and when I hit Ctrl-C, funccount is not exiting (it can normally take many seconds, but this really looks stuck): # pidstat 1 Linux 4.9.0-rc1-virtual (bgregg-xenial-bpf-i-xxx) 10/18/2016 _x86_64_ (8 CPU) 10:00:33 PM UID PID %usr %system %guest %CPU CPU Command 10:00:34 PM 60004 3277 0.00 0.98 0.00 0.98 0 redis-server 10:00:34 PM 0 27980 87.25 10.78 0.00 98.04 3 funccount.py 10:00:34 PM 0 29965 0.00 0.98 0.00 0.98 6 pidstat 10:00:34 PM UID PID %usr %system %guest %CPU CPU Command 10:00:35 PM 65534 3276 0.00 1.00 0.00 1.00 2 multilog 10:00:35 PM 0 27980 77.00 23.00 0.00 100.00 3 funccount.py 10:00:35 PM 0 29965 0.00 1.00 0.00 1.00 6 pidstat 10:00:35 PM 60004 29990 0.00 1.00 0.00 1.00 6 catalina.sh funccount looks a lot like it's in an infinite loop (I can use a stack-sampling profiler to confirm). This is a known bug (#665) and may be fixed by the time you read this. But right now it's a good example of needing reset-trace. I'll send a SIGTERM, before resorting to a SIGKILL: # kill 27980 Terminated Ok, so the process is now gone, but it did leave tracing in a semi-enabled state. Using reset-trace: # ./reset-trace.sh -v Resetting tracing state... Checking /sys/kernel/debug/tracing/kprobe_events Checking /sys/kernel/debug/tracing/uprobe_events Needed to reset /sys/kernel/debug/tracing/uprobe_events uprobe_events, before (line enumerated): 1 p:uprobes/p__bin_bash_0xa2540 /bin/bash:0x00000000000a2540 2 p:uprobes/p__bin_bash_0x21220 /bin/bash:0x0000000000021220 3 p:uprobes/p__bin_bash_0x78530 /bin/bash:0x0000000000078530 4 p:uprobes/p__bin_bash_0xa3840 /bin/bash:0x00000000000a3840 5 p:uprobes/p__bin_bash_0x9c550 /bin/bash:0x000000000009c550 6 p:uprobes/p__bin_bash_0x5e360 /bin/bash:0x000000000005e360 7 p:uprobes/p__bin_bash_0xb2630 /bin/bash:0x00000000000b2630 8 p:uprobes/p__bin_bash_0xb1e70 /bin/bash:0x00000000000b1e70 9 p:uprobes/p__bin_bash_0xb2540 /bin/bash:0x00000000000b2540 10 p:uprobes/p__bin_bash_0xb16e0 /bin/bash:0x00000000000b16e0 [...] 312 p:uprobes/p__bin_bash_0xa80b0 /bin/bash:0x00000000000a80b0 313 p:uprobes/p__bin_bash_0x9e280 /bin/bash:0x000000000009e280 314 p:uprobes/p__bin_bash_0x9e100 /bin/bash:0x000000000009e100 315 p:uprobes/p__bin_bash_0xb2bd0 /bin/bash:0x00000000000b2bd0 316 p:uprobes/p__bin_bash_0x9d9c0 /bin/bash:0x000000000009d9c0 317 p:uprobes/p__bin_bash_0x4a930 /bin/bash:0x000000000004a930 uprobe_events, after (line enumerated): Checking /sys/kernel/debug/tracing/trace Checking /sys/kernel/debug/tracing/current_tracer Checking /sys/kernel/debug/tracing/set_ftrace_filter Checking /sys/kernel/debug/tracing/set_graph_function Checking /sys/kernel/debug/tracing/set_ftrace_pid Checking /sys/kernel/debug/tracing/events/enable Checking /sys/kernel/debug/tracing/tracing_thresh Checking /sys/kernel/debug/tracing/tracing_on Done. Now looks clean. I did truncate the output here: there were a few hundred lines from uprobe_events. Here's the same situation, but without the verbose option: # ./reset-trace.sh Needed to reset /sys/kernel/debug/tracing/uprobe_events # And again with quiet: # ./reset-trace.sh -q # Here is an example of reset-trace detecting an unrelated tracing session: # ./reset-trace.sh Noticed unrelated tracing file /sys/kernel/debug/tracing/set_ftrace_filter isn't set as expected. Not resetting (-F to force, -v for verbose). And verbose: # ./reset-trace.sh -v Resetting tracing state... Checking /sys/kernel/debug/tracing/kprobe_events Checking /sys/kernel/debug/tracing/uprobe_events Checking /sys/kernel/debug/tracing/trace Checking /sys/kernel/debug/tracing/current_tracer Checking /sys/kernel/debug/tracing/set_ftrace_filter Noticed unrelated tracing file /sys/kernel/debug/tracing/set_ftrace_filter isn't set as expected. Not resetting (-F to force, -v for verbose). Contents of set_ftrace_filter is (line enumerated): 1 tcp_send_mss 2 tcp_sendpage 3 tcp_sendmsg 4 tcp_send_dupack 5 tcp_send_challenge_ack.isra.53 6 tcp_send_rcvq 7 tcp_send_ack 8 tcp_send_loss_probe 9 tcp_send_fin 10 tcp_send_active_reset 11 tcp_send_synack 12 tcp_send_delayed_ack 13 tcp_send_window_probe 14 tcp_send_probe0 Expected "". Checking /sys/kernel/debug/tracing/set_graph_function Checking /sys/kernel/debug/tracing/set_ftrace_pid Checking /sys/kernel/debug/tracing/events/enable Checking /sys/kernel/debug/tracing/tracing_thresh Checking /sys/kernel/debug/tracing/tracing_on Done. So this file is not currently used by bcc, but it may be useful to know that it's not in the default state -- something is either using it or has left it enabled. These files can be reset with -F, but that may break other tools that are currently using them. Use -h to print the USAGE message: # ./reset-trace.sh -h USAGE: reset-trace [-Fhqv] -F # force: reset all tracing files -v # verbose: print details while working -h # this usage message -q # quiet: no output eg, reset-trace # disable semi-enabled tracing