From 43691ca179b1e573ca01e7bff87404519d4a3d75 Mon Sep 17 00:00:00 2001 From: Pierre Langlois Date: Thu, 17 Sep 2015 11:39:10 +0100 Subject: [PATCH] Add test case for tracepoints with conditions This patch adds a test case for tracepoints with a condition expression. Each case will test a condition against the number of frames that should have been traced. Some of these tests fail on x86_64 and others on i386, which have been marked as known failures for now, see PR/18955. gdb/testsuite/ChangeLog: 2015-09-17 Pierre Langlois Yao Qi * gdb.trace/trace-condition.c: New file. * gdb.trace/trace-condition.exp: New file. --- gdb/testsuite/ChangeLog | 6 + gdb/testsuite/gdb.trace/trace-condition.c | 66 ++++++++ gdb/testsuite/gdb.trace/trace-condition.exp | 168 ++++++++++++++++++++ 3 files changed, 240 insertions(+) create mode 100644 gdb/testsuite/gdb.trace/trace-condition.c create mode 100644 gdb/testsuite/gdb.trace/trace-condition.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index a0ac2ca54b..8d0ffd4b1d 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-09-17 Pierre Langlois + Yao Qi + + * gdb.trace/trace-condition.c: New file. + * gdb.trace/trace-condition.exp: New file. + 2015-09-16 Wei-cheng Wang * gdb.trace/ftrace.exp: (test_ftrace_condition) New function diff --git a/gdb/testsuite/gdb.trace/trace-condition.c b/gdb/testsuite/gdb.trace/trace-condition.c new file mode 100644 index 0000000000..2e965c9b6a --- /dev/null +++ b/gdb/testsuite/gdb.trace/trace-condition.c @@ -0,0 +1,66 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011-2015 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef SYMBOL_PREFIX +#define SYMBOL(str) SYMBOL_PREFIX #str +#else +#define SYMBOL(str) #str +#endif + +int globvar; + +static void +begin (void) +{ +} + +/* Called from asm. */ +static void __attribute__((used)) +func (void) +{ +} + +static void +marker (int anarg) +{ + /* `set_point' is the label at which to set a fast tracepoint. The + insn at the label must be large enough to fit a fast tracepoint + jump. */ + asm (" .global " SYMBOL (set_point) "\n" + SYMBOL (set_point) ":\n" +#if (defined __x86_64__ || defined __i386__) + " call " SYMBOL (func) "\n" +#endif + ); +} + +static void +end (void) +{ +} + +int +main () +{ + begin (); + + for (globvar = 1; globvar < 11; ++globvar) + marker (globvar * 100); + + end (); + return 0; +} diff --git a/gdb/testsuite/gdb.trace/trace-condition.exp b/gdb/testsuite/gdb.trace/trace-condition.exp new file mode 100644 index 0000000000..d10fa9ae8f --- /dev/null +++ b/gdb/testsuite/gdb.trace/trace-condition.exp @@ -0,0 +1,168 @@ +# Copyright 2011-2015 Free Software Foundation, Inc. +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib "trace-support.exp" + +standard_testfile +set executable $testfile +set expfile $testfile.exp + +# Some targets have leading underscores on assembly symbols. +set additional_flags [gdb_target_symbol_prefix_flags] + +if [is_amd64_regs_target] { + set pcreg "\$rip" +} elseif [is_x86_like_target] { + set pcreg "\$eip" +} else { + set pcreg "\$pc" +} + +if [prepare_for_testing $expfile $executable $srcfile \ + [list debug $additional_flags]] { + untested "failed to prepare for trace tests" + return -1 +} + +if ![runto_main] { + fail "Can't run to main to check for trace support" + return -1 +} + +if ![gdb_target_supports_trace] { + unsupported "target does not support trace" + return -1 +} + +set libipa [get_in_proc_agent] +gdb_load_shlibs $libipa + +# Can't use prepare_for_testing, because that splits compiling into +# building objects and then linking, and we'd fail with "linker input +# file unused because linking not done" when building the object. + +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable [list debug $additional_flags shlib=$libipa] ] != "" } { + untested "failed to compile ftrace tests" + return -1 +} + +clean_restart ${executable} + +if ![runto_main] { + fail "Can't run to main for ftrace tests" + return 0 +} + +if { [gdb_test "info sharedlibrary" ".*${libipa}.*" "IPA loaded"] != 0 } { + untested "Could not find IPA lib loaded" + return 1 +} + +proc test_tracepoints { trace_command condition num_frames { kfail_proc 0 } } { + global executable gdb_prompt + + clean_restart ${executable} + + if ![runto_main] { + fail "Can't run to main for ftrace tests" + return 0 + } + + gdb_test "break begin" ".*" "" + + gdb_test "break end" ".*" "" + + with_test_prefix "${trace_command}: ${condition}" { + + gdb_test "${trace_command} set_point if ${condition}" \ + "\(Fast t|T\)racepoint .*" \ + "set tracepoint" + + gdb_test "continue" ".*Breakpoint \[0-9\]+, begin .*" \ + "advance to trace begin" + + gdb_test_no_output "tstart" "start trace experiment" + + gdb_test_multiple "continue" "advance through tracing" { + -re ".*Breakpoint \[0-9\]+, end .*$gdb_prompt $" { + pass "advance through tracing" + } + -re "Program received signal SIGSEGV, Segmentation fault\\..*$gdb_prompt $" { + if { $kfail_proc != 0 } { + $kfail_proc $trace_command + } + fail "advance through tracing" + } + } + + if { $kfail_proc != 0 } { + $kfail_proc $trace_command + } + gdb_test "tstatus" \ + ".*Trace .*Collected $num_frames .*" \ + "check $num_frames frames were collected." + + gdb_test "tstop" "" "" + } +} + +# These callbacks identify known failures for certain architectures. They +# are called either if GDBserver crashes or has not traced the correct +# number of frames. + +proc 18955_x86_64_failure { trace_command } { + if { $trace_command == "ftrace" } { + setup_kfail "gdb/18955" "x86_64-*-linux*" + } +} + +proc 18955_i386_failure { trace_command } { + if { $trace_command == "ftrace" } { + setup_kfail "gdb/18955" "i\[34567\]86-*-*" + } +} + +foreach trace_command { "trace" "ftrace" } { + # This condition is always true as the PC should be set to the tracepoint + # address when hit. + test_tracepoints $trace_command "$pcreg == *set_point" 10 + + # Can we read local variables? + test_tracepoints $trace_command "anarg == 100 || anarg == 200" 2 18955_x86_64_failure + # Can we read global variables? + test_tracepoints $trace_command "anarg == 100 && globvar == 1" 1 18955_x86_64_failure + + # Test various operations to cover as many opcodes as possible. + test_tracepoints $trace_command "21 + 21 == 42" 10 + test_tracepoints $trace_command "21 - 21 == 0" 10 + test_tracepoints $trace_command "21 * 2 == 42" 10 + test_tracepoints $trace_command "21 << 1 == 42" 10 + test_tracepoints $trace_command "42 >> 1 == 21" 10 + test_tracepoints $trace_command "-21 << 1 == -42" 10 + test_tracepoints $trace_command "-42 >> 1 == -21" 10 + test_tracepoints $trace_command "(0xabababab & 0x0000ffff) == 0xabab" 10 + test_tracepoints $trace_command "(0xabababab | 0x0000ffff) == 0xababffff" 10 + test_tracepoints $trace_command "(0xaaaaaaaa ^ 0x55555555) == 0xffffffff" 10 + test_tracepoints $trace_command "~0xaaaaaaaa == 0x55555555" 10 + test_tracepoints $trace_command "21 < 42" 10 + test_tracepoints $trace_command "42 <= 42" 10 + test_tracepoints $trace_command "42 >= 42" 10 + test_tracepoints $trace_command "42 > 21" 10 + test_tracepoints $trace_command "(21 < 42 ? 0 : 1) == 0" 10 18955_i386_failure + test_tracepoints $trace_command "(42 <= 42 ? 0 : 1) == 0" 10 + test_tracepoints $trace_command "(42 >= 42 ? 0 : 1) == 0" 10 + test_tracepoints $trace_command "(42 > 21 ? 0 : 1) == 0" 10 18955_i386_failure + test_tracepoints $trace_command "\$trace_timestamp >= 0" 10 +}