selftests/ftrace: Add error_log testcase for probe errors
Add error_log testcase for error logs on probe events. This tests most of error cases and checks the error position is correct. Link: http://lkml.kernel.org/r/63d695b74e0965988fa54ffa12beeb2c3475250d.1554072478.git.tom.zanussi@linux.intel.com Acked-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> [tom.zanussi@linux.intel.com: changed >& redirection to 2>] Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
parent
2f754e771b
commit
8ab4483eb6
|
@ -0,0 +1,93 @@
|
|||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# description: Kprobe event parser error log check
|
||||
|
||||
[ -f kprobe_events ] || exit_unsupported # this is configurable
|
||||
|
||||
[ -f error_log ] || exit_unsupported
|
||||
|
||||
check_error() { # command-with-error-pos-by-^
|
||||
pos=$(echo -n "${1%^*}" | wc -c) # error position
|
||||
command=$(echo "$1" | tr -d ^)
|
||||
echo "Test command: $command"
|
||||
echo > error_log
|
||||
(! echo "$command" > kprobe_events ) 2> /dev/null
|
||||
grep "trace_kprobe: error:" -A 3 error_log
|
||||
N=$(tail -n 1 error_log | wc -c)
|
||||
# " Command: " and "^\n" => 13
|
||||
test $(expr 13 + $pos) -eq $N
|
||||
}
|
||||
|
||||
if grep -q 'r\[maxactive\]' README; then
|
||||
check_error 'p^100 vfs_read' # MAXACT_NO_KPROBE
|
||||
check_error 'r^1a111 vfs_read' # BAD_MAXACT
|
||||
check_error 'r^100000 vfs_read' # MAXACT_TOO_BIG
|
||||
fi
|
||||
|
||||
check_error 'p ^non_exist_func' # BAD_PROBE_ADDR (enoent)
|
||||
check_error 'p ^hoge-fuga' # BAD_PROBE_ADDR (bad syntax)
|
||||
check_error 'p ^hoge+1000-1000' # BAD_PROBE_ADDR (bad syntax)
|
||||
check_error 'r ^vfs_read+10' # BAD_RETPROBE
|
||||
check_error 'p:^/bar vfs_read' # NO_GROUP_NAME
|
||||
check_error 'p:^12345678901234567890123456789012345678901234567890123456789012345/bar vfs_read' # GROUP_TOO_LONG
|
||||
|
||||
check_error 'p:^foo.1/bar vfs_read' # BAD_GROUP_NAME
|
||||
check_error 'p:foo/^ vfs_read' # NO_EVENT_NAME
|
||||
check_error 'p:foo/^12345678901234567890123456789012345678901234567890123456789012345 vfs_read' # EVENT_TOO_LONG
|
||||
check_error 'p:foo/^bar.1 vfs_read' # BAD_EVENT_NAME
|
||||
|
||||
check_error 'p vfs_read ^$retval' # RETVAL_ON_PROBE
|
||||
check_error 'p vfs_read ^$stack10000' # BAD_STACK_NUM
|
||||
|
||||
if grep -q '$arg<N>' README; then
|
||||
check_error 'p vfs_read ^$arg10000' # BAD_ARG_NUM
|
||||
fi
|
||||
|
||||
check_error 'p vfs_read ^$none_var' # BAD_VAR
|
||||
|
||||
check_error 'p vfs_read ^%none_reg' # BAD_REG_NAME
|
||||
check_error 'p vfs_read ^@12345678abcde' # BAD_MEM_ADDR
|
||||
check_error 'p vfs_read ^@+10' # FILE_ON_KPROBE
|
||||
|
||||
check_error 'p vfs_read ^+0@0)' # DEREF_NEED_BRACE
|
||||
check_error 'p vfs_read ^+0ab1(@0)' # BAD_DEREF_OFFS
|
||||
check_error 'p vfs_read +0(+0(@0^)' # DEREF_OPEN_BRACE
|
||||
|
||||
if grep -A1 "fetcharg:" README | grep -q '\$comm' ; then
|
||||
check_error 'p vfs_read +0(^$comm)' # COMM_CANT_DEREF
|
||||
fi
|
||||
|
||||
check_error 'p vfs_read ^&1' # BAD_FETCH_ARG
|
||||
|
||||
|
||||
# We've introduced this limitation with array support
|
||||
if grep -q ' <type>\\\[<array-size>\\\]' README; then
|
||||
check_error 'p vfs_read +0(^+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(@0))))))))))))))' # TOO_MANY_OPS?
|
||||
check_error 'p vfs_read +0(@11):u8[10^' # ARRAY_NO_CLOSE
|
||||
check_error 'p vfs_read +0(@11):u8[10]^a' # BAD_ARRAY_SUFFIX
|
||||
check_error 'p vfs_read +0(@11):u8[^10a]' # BAD_ARRAY_NUM
|
||||
check_error 'p vfs_read +0(@11):u8[^256]' # ARRAY_TOO_BIG
|
||||
fi
|
||||
|
||||
check_error 'p vfs_read @11:^unknown_type' # BAD_TYPE
|
||||
check_error 'p vfs_read $stack0:^string' # BAD_STRING
|
||||
check_error 'p vfs_read @11:^b10@a/16' # BAD_BITFIELD
|
||||
|
||||
check_error 'p vfs_read ^arg123456789012345678901234567890=@11' # ARG_NAME_TOO_LOG
|
||||
check_error 'p vfs_read ^=@11' # NO_ARG_NAME
|
||||
check_error 'p vfs_read ^var.1=@11' # BAD_ARG_NAME
|
||||
check_error 'p vfs_read var1=@11 ^var1=@12' # USED_ARG_NAME
|
||||
check_error 'p vfs_read ^+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(@1234))))))' # ARG_TOO_LONG
|
||||
check_error 'p vfs_read arg1=^' # NO_ARG_BODY
|
||||
|
||||
# instruction boundary check is valid on x86 (at this moment)
|
||||
case $(uname -m) in
|
||||
x86_64|i[3456]86)
|
||||
echo 'p vfs_read' > kprobe_events
|
||||
if grep -q FTRACE ../kprobes/list ; then
|
||||
check_error 'p ^vfs_read+3' # BAD_INSN_BNDRY (only if function-tracer is enabled)
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,31 @@
|
|||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# description: Uprobe event parser error log check
|
||||
|
||||
[ -f uprobe_events ] || exit_unsupported # this is configurable
|
||||
|
||||
[ -f error_log ] || exit_unsupported
|
||||
|
||||
check_error() { # command-with-error-pos-by-^
|
||||
pos=$(echo -n "${1%^*}" | wc -c) # error position
|
||||
command=$(echo "$1" | tr -d ^)
|
||||
echo "Test command: $command"
|
||||
echo > error_log
|
||||
(! echo "$command" > uprobe_events ) 2> /dev/null
|
||||
grep "trace_uprobe: error:" -A 3 error_log
|
||||
N=$(tail -n 1 error_log | wc -c)
|
||||
# " Command: " and "^\n" => 13
|
||||
test $(expr 13 + $pos) -eq $N
|
||||
}
|
||||
|
||||
check_error 'p ^/non_exist_file:100' # FILE_NOT_FOUND
|
||||
check_error 'p ^/sys:100' # NO_REGULAR_FILE
|
||||
check_error 'p /bin/sh:^10a' # BAD_UPROBE_OFFS
|
||||
check_error 'p /bin/sh:10(^1a)' # BAD_REFCNT
|
||||
check_error 'p /bin/sh:10(10^' # REFCNT_OPEN_BRACE
|
||||
check_error 'p /bin/sh:10(10)^a' # BAD_REFCNT_SUFFIX
|
||||
|
||||
check_error 'p /bin/sh:10 ^@+ab' # BAD_FILE_OFFS
|
||||
check_error 'p /bin/sh:10 ^@symbol' # SYM_ON_UPROBE
|
||||
|
||||
exit 0
|
Loading…
Reference in New Issue