summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.context/uprobe_uaddr.exp
diff options
context:
space:
mode:
authorTim Moore <timoore@redhat.com>2009-12-16 12:00:55 +0100
committerTim Moore <timoore@redhat.com>2009-12-16 15:03:22 +0100
commit5e562a69a5432566c6ae78344ae51b80ced7f15b (patch)
tree3c8101132cad09ef61b0ccc89d1d0be0dc324fd8 /testsuite/systemtap.context/uprobe_uaddr.exp
parent39a3e39706a18dbf3698b52fc1cc7532d94078e8 (diff)
downloadsystemtap-steved-5e562a69a5432566c6ae78344ae51b80ced7f15b.tar.gz
systemtap-steved-5e562a69a5432566c6ae78344ae51b80ced7f15b.tar.xz
systemtap-steved-5e562a69a5432566c6ae78344ae51b80ced7f15b.zip
set the IP in return probes to the returned-to instruction
It's easily available in kretprobes and uretprobes and is consistent with the rest of the program state. * translate.cxx (emit_common_header) : add uretprobe_instance to context. * tapsets.cxx (common_probe_entryfn_prologue): Initialize ri in context to 0. (dwarf_derived_probe_group::emit_module_decls): Change IP to return address in kretprobes. (uprobe_derived_probe_group::emit_module_decls): enter_uretprobe_probe: set ri (uretprobe_instance) in context. Change IP to return address in uretprobes. Don't emit uprobe include and #define * runtime/runtime.h : Add includes and #define for uprobes. * runtime/stack.c (_stp_stack_print, _stp_stack_snprint): Add extra argument for uretprobe_instance. * tapset/context-unwind.stp (print_backtrace, backtrace): Pass NULL for uretprobe_instance to _stp_stack_print. * tapset/ucontext-unwind.stp (print_ubacktrace, ubacktrace): pass uretprobe_instance to _stp_stack_print * testsuite/systemtap.context/uprobe_uaddr.exp : new test for uaddr in function probes * testsuite/systemtap.context/uprobe_uaddr.stp : new file
Diffstat (limited to 'testsuite/systemtap.context/uprobe_uaddr.exp')
-rw-r--r--testsuite/systemtap.context/uprobe_uaddr.exp58
1 files changed, 58 insertions, 0 deletions
diff --git a/testsuite/systemtap.context/uprobe_uaddr.exp b/testsuite/systemtap.context/uprobe_uaddr.exp
new file mode 100644
index 00000000..521dfa57
--- /dev/null
+++ b/testsuite/systemtap.context/uprobe_uaddr.exp
@@ -0,0 +1,58 @@
+# Tests uaddr in function call and return probes. For a call probe we
+# expect the address to be in the function; for a return probe it
+# should be in the function's caller.
+
+set test "uprobe_uaddr"
+
+# Only run on make installcheck and utrace present.
+if {! [installtest_p]} { untested "$test"; return }
+if {! [utrace_p]} { untested "$test"; return }
+
+set testpath "$srcdir/$subdir"
+set testsrc "$testpath/uprobe_stmt_num.c"
+set testexe "[pwd]/$test"
+
+# We want debug info and no optimization (every line counts).
+set testflags "additional_flags=-g additional_flags=-O0"
+set teststp "$testpath/$test.stp"
+
+set res [target_compile $testsrc $testexe executable $testflags]
+if { $res != "" } {
+ verbose "target_compile failed: $res" 2
+ fail "unable to compile $testsrc"
+ return
+}
+
+set cmd [concat stap -c $testexe $teststp]
+send_log "cmd: $cmd\n"
+catch {eval exec $cmd} output
+send_log "cmd output:\n $output\n"
+
+set output_lines [split $output "\n"]
+
+set lines [llength $output_lines]
+if { $lines == 6 } {
+ pass "$test"
+} else {
+ fail "$test ($lines)"
+}
+
+set result_funcs [list "main *" "func *" "func2 *" "func *" "main *"]
+
+foreach expected $result_funcs output $output_lines {
+ if {$expected != ""} {
+ if [string match $expected $output] {
+ pass "$test"
+ } else {
+ fail "$test $output"
+ }
+ } else {
+ break;
+ }
+}
+
+if [string match "main *" [lindex $output_lines 5]] {
+ fail "$test return from main"
+} else {
+ pass "$test"
+}