Re: [PATCH 2/2] Add test for fast tracepoint enable/disable

Simon Marchi
2016-03-31T18:31:26Z

On 16-03-31 02:01 PM, Simon Marchi wrote:
>> Can you extend the test to cover normal tracepoint as well? It
>> shouldn't be hard. You can just pass argument "type" to "proc
>> test_trace_enable_disable" like,
>>
>> proc test_trace_enable_disable { type } {
>>
>> and the type can be "trace" and "ftrace".
>
> I'll try to do that.
>
> Thanks,
>
> Simon

Here is an updated patch that tests both trace and ftrace. I left gdb_compile_pthreads
for now, while we discuss.

One thing that could be improved is that the test should be organized so that it tests
normal tracepoints even if fast tracepoints are not supported by the architecture.
Right now, I think it will do both or none at all.

From 09ccbccb0176feaaf8a385adad28dab6ff357f33 Mon Sep 17 00:00:00 2001
From: Simon Marchi <simon.marchi@ericsson.com>
Date: Wed, 30 Mar 2016 10:24:05 -0400
Subject: [PATCH] Add test for tracepoint enable/disable

This patch adds a test for tracepoints enabling/disabling, which
didn't work properly for fast tracepoints on big endian systems.

gdb/testsuite/ChangeLog:

* gdb.trace/trace-enable-disable.exp: New file.
* gdb.trace/trace-enable-disable.c: New file.
---
gdb/testsuite/gdb.trace/trace-enable-disable.c | 38 +++++++
gdb/testsuite/gdb.trace/trace-enable-disable.exp | 128 +++++++++++++++++++++++
2 files changed, 166 insertions(+)
create mode 100644 gdb/testsuite/gdb.trace/trace-enable-disable.c
create mode 100644 gdb/testsuite/gdb.trace/trace-enable-disable.exp

diff --git a/gdb/testsuite/gdb.trace/trace-enable-disable.c b/gdb/testsuite/gdb.trace/trace-enable-disable.c
new file mode 100644
index 0000000..23453db
--- /dev/null
+++ b/gdb/testsuite/gdb.trace/trace-enable-disable.c
@@ -0,0 +1,38 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2016 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 <http://www.gnu.org/licenses/>. */
+
+#include "trace-common.h"
+
+static void
+break_here (void)
+{
+}
+
+int
+main (void)
+{
+ int i;
+
+ for (i = 0; i < 100; i++)
+ {
+ FAST_TRACEPOINT_LABEL(point_a);
+ FAST_TRACEPOINT_LABEL(point_b);
+ break_here ();
+ }
+
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.trace/trace-enable-disable.exp b/gdb/testsuite/gdb.trace/trace-enable-disable.exp
new file mode 100644
index 0000000..2d9d6c7
--- /dev/null
+++ b/gdb/testsuite/gdb.trace/trace-enable-disable.exp
@@ -0,0 +1,128 @@
+# Copyright 2015-2016 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 <http://www.gnu.org/licenses/>.
+
+load_lib "trace-support.exp"
+
+standard_testfile
+set executable $testfile
+set expfile $testfile.exp
+
+# Some targets have leading underscores on assembly symbols.
+set options [list debug [gdb_target_symbol_prefix_flags]]
+
+# Check that the target supports trace.
+if { [gdb_compile_pthreads "$srcdir/$subdir/$srcfile" $binfile executable $options] != "" } {
+ untested "Couldn't compile test program"
+ return -1
+}
+
+clean_restart ${testfile}
+
+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
+}
+
+# Compile the test case with the in-process agent library.
+set libipa [get_in_proc_agent]
+gdb_load_shlibs $libipa
+
+lappend options shlib=$libipa
+
+if { [gdb_compile_pthreads "$srcdir/$subdir/$srcfile" $binfile executable $options] != "" } {
+ untested "Couldn't compile test program with in-process agent library"
+ return -1
+}
+
+# This test makes sure that disabling and enabling tracepoints works
+# correctly. TRACEPOINT_CMD is the command used to set tracepoints
+# (e.g. trace or ftrace).
+
+proc test_tracepoint_enable_disable { tracepoint_cmd } {
+ with_test_prefix "test_tracepoint_enable_disable" {
+ global executable binfile decimal
+ clean_restart ${executable}
+
+ set expected 0
+
+ if ![runto_main] {
+ fail "Can't run to main."
+ return -1
+ }
+
+ gdb_test "$tracepoint_cmd point_a" "(Tracepoint|Fast tracepoint) 2.*"
+ gdb_test "$tracepoint_cmd point_b" "(Tracepoint|Fast tracepoint) 3.*"
+ gdb_breakpoint "break_here"
+ gdb_test_no_output "tstart"
+
+ # Test that tracepoints start enabled
+ with_test_prefix "start" {
+ gdb_continue "break_here"
+ incr expected 2
+ gdb_test "tstatus" "Collected $expected trace frames.*"
+ }
+
+ # Test that disabling works
+ with_test_prefix "disable #1" {
+ gdb_test_no_output "disable 2"
+ gdb_continue "break_here"
+ incr expected 1
+ gdb_test "tstatus" "Collected $expected trace frames.*"
+ }
+
+ with_test_prefix "disable #2" {
+ gdb_test_no_output "disable 3"
+ gdb_continue "break_here"
+ gdb_test "tstatus" "Collected $expected trace frames.*"
+ }
+
+ # Test that disabling an already disabled tracepoint works
+ with_test_prefix "disable #3" {
+ gdb_test_no_output "disable 2"
+ gdb_continue "break_here"
+ gdb_test "tstatus" "Collected $expected trace frames.*"
+ }
+
+ # Test that enabling works
+ with_test_prefix "enable #1" {
+ gdb_test_no_output "enable 2"
+ gdb_continue "break_here"
+ incr expected 1
+ gdb_test "tstatus" "Collected $expected trace frames.*"
+ }
+
+ with_test_prefix "enable #2" {
+ gdb_test_no_output "enable 3"
+ gdb_continue "break_here"
+ incr expected 2
+ gdb_test "tstatus" "Collected $expected trace frames.*"
+ }
+
+ # Test that enabling an already enabled tracepoint works
+ with_test_prefix "enable #3" {
+ gdb_test_no_output "enable 3"
+ gdb_continue "break_here"
+ incr expected 2
+ gdb_test "tstatus" "Collected $expected trace frames.*"
+ }
+ }
+}
+
+test_tracepoint_enable_disable trace
+test_tracepoint_enable_disable ftrace
--
2.8.0