#!/bin/bash TARGETS=$1 FTRACE_KPROBE_EVENT=/sys/kernel/debug/tracing/kprobe_events FTRACE_KPROBE_PROFILE=/sys/kernel/debug/tracing/kprobe_profile FTRACE_EVENTS=/sys/kernel/debug/tracing/events if [ ! -f $TARGETS ]; then echo "Usage: kprobe_test.sh " exit 1 fi if [ `id -u` -ne 0 ]; then echo "Error: This program requires root privilege" exit 2 fi function get_symbol_size() { #symbol grep $1 -w -m1 -A1 /proc/kallsyms |\ awk 'BEGIN{ s = 0 }; {p = strtonum("0x"substr($1,9,8)); if (s == 0) {s = p;} else { print p - s}}' } function setup_probes() { #symbol size=`get_symbol_size $1` if [ -z "$size" ]; then echo "No symbol $1 found" return 1 fi i=0 err=0 while [ $i -lt $size ]; do (echo p $1+$i >> $FTRACE_KPROBE_EVENT) &> /dev/null [ $? -eq 0 ] || err=$((err+1)) i=$((i+1)) done probed=`expr $size - $err` echo "Setup $probed probes on $1" [ $probed -eq 0 ] && return 1 return 0 } function enable_probes() { echo 1 > $FTRACE_EVENTS/kprobes/enable } function clear_probes() { echo 0 > $FTRACE_EVENTS/kprobes/enable echo > $FTRACE_KPROBE_EVENT } function run_test() { echo p:test1 vfs_symlink >> $FTRACE_KPROBE_EVENT echo p:test2 vfs_symlink+5 >> $FTRACE_KPROBE_EVENT echo 1 > $FTRACE_EVENTS/kprobes/test1/enable echo 1 > $FTRACE_EVENTS/kprobes/test2/enable sleep 1 echo 0 > $FTRACE_EVENTS/kprobes/test1/enable echo 0 > $FTRACE_EVENTS/kprobes/test2/enable echo -:test1 >> $FTRACE_KPROBE_EVENT echo -:test2 >> $FTRACE_KPROBE_EVENT } function save_profile() { # symbol cat $FTRACE_KPROBE_PROFILE > ${1}.profile } function test_on() { # symbol setup_probes $1 [ $? -ne 0 ] && return enable_probes echo "Probe Enabled" run_test echo "Test done on $1" save_profile $1 clear_probes } clear_probes cat $TARGETS | while read sym; do test_on $sym done