From 01b088bc51fe37e07905d36547f4ea43904837c0 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Mon, 26 Jan 2015 17:52:28 +0000 Subject: [PATCH] Add "signal SIGTRAP" test Some local changes I was working on related to SIGTRAP handling resulted in "signal SIGTRAP" no longer passing the SIGTRAP to the inferior. Surprisingly, only annota1.exp catches this. This commit adds a test that doesn't rely on annotations, so that at the point annotations are finaly dropped, we still have this use case covered ... This is a multi-threaded test to also exercise the case of first needing to do a step-over before delivering the signal. Tested on x86_64 Fedora 20, native, remote/extended-remote gdbserver. gdb/testsuite/ 2015-02-10 Pedro Alves * gdb.threads/signal-sigtrap.c: New file. * gdb.threads/signal-sigtrap.exp: New file. --- gdb/testsuite/ChangeLog | 5 ++ gdb/testsuite/gdb.threads/signal-sigtrap.c | 46 ++++++++++++++ gdb/testsuite/gdb.threads/signal-sigtrap.exp | 67 ++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 gdb/testsuite/gdb.threads/signal-sigtrap.c create mode 100644 gdb/testsuite/gdb.threads/signal-sigtrap.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c1d76d6ad13..bc4c0220457 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-02-10 Pedro Alves + + * gdb.threads/signal-sigtrap.c: New file. + * gdb.threads/signal-sigtrap.exp: New file. + 2015-02-10 Antoine Tremblay * gdb.trace/no-attach-trace.c: New file. diff --git a/gdb/testsuite/gdb.threads/signal-sigtrap.c b/gdb/testsuite/gdb.threads/signal-sigtrap.c new file mode 100644 index 00000000000..4513d386258 --- /dev/null +++ b/gdb/testsuite/gdb.threads/signal-sigtrap.c @@ -0,0 +1,46 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2014-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 . */ + +#include +#include +#include +#include + +void +sigtrap_handler (int sig) +{ +} + +void * +thread_function (void *arg) +{ + return NULL; +} + +int +main (void) +{ + pthread_t child_thread; + + signal (SIGTRAP, sigtrap_handler); + + pthread_create (&child_thread, NULL, thread_function, NULL); + + pthread_join (child_thread, NULL); + + return 0; +} diff --git a/gdb/testsuite/gdb.threads/signal-sigtrap.exp b/gdb/testsuite/gdb.threads/signal-sigtrap.exp new file mode 100644 index 00000000000..c535da62b7e --- /dev/null +++ b/gdb/testsuite/gdb.threads/signal-sigtrap.exp @@ -0,0 +1,67 @@ +# Copyright (C) 2014-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 . */ + +# Check that GDB doesn't forget to pass SIGTRAP to the program when +# the user explicitly passes it with the signal command. + +if [target_info exists gdb,nosignals] { + verbose "Skipping ${testfile}.exp because of nosignals." + return -1 +} + +standard_testfile + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug pthreads}]} { + return -1 +} + +# Run test proper. SIGTRAP_THREAD is the thread that should get the +# SIGTRAP. + +proc test { sigtrap_thread } { + global srcfile binfile + + with_test_prefix "sigtrap thread $sigtrap_thread" { + clean_restart ${binfile} + + if ![runto "thread_function"] then { + fail "Can't run to thread_function" + return 0 + } + + set pattern "\\\* 2\[ \t\]+Thread.*" + gdb_test "info threads" $pattern "thread 2 hit breakpoint" + + gdb_test "break sigtrap_handler" "Breakpoint .* at .*$srcfile.*" + + # Thread 2 is stopped at a breakpoint, which must be stepped + # over first. Thus if this is thread 1, then GDB will first + # switch back to thread 2 to step it over the breakpoint. + gdb_test "thread $sigtrap_thread" \ + "Switching to thread $sigtrap_thread.*" \ + "switch to sigtrap thread" + + gdb_test "signal SIGTRAP" \ + "Continuing with signal SIGTRAP.*Breakpoint .* sigtrap_handler .*" \ + "signal SIGTRAP reaches handler" + + set pattern "\\\* $sigtrap_thread\[ \t\]+Thread.*" + gdb_test "info threads" $pattern "right thread got the signal" + } +} + +foreach sigtrap_thread {1 2} { + test $sigtrap_thread +} -- 2.30.2