diff options
author | Pedro Alves <palves@redhat.com> | 2015-01-26 17:52:28 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2015-02-10 19:30:55 +0000 |
commit | 01b088bc51fe37e07905d36547f4ea43904837c0 (patch) | |
tree | 79974766f86004f46b1479289a438a8241ae7363 /gdb/testsuite/gdb.threads | |
parent | b052c4fbf5e64a2e96452642adf433f60b185245 (diff) | |
download | gdb-01b088bc51fe37e07905d36547f4ea43904837c0.zip gdb-01b088bc51fe37e07905d36547f4ea43904837c0.tar.gz gdb-01b088bc51fe37e07905d36547f4ea43904837c0.tar.bz2 |
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 <palves@redhat.com>
* gdb.threads/signal-sigtrap.c: New file.
* gdb.threads/signal-sigtrap.exp: New file.
Diffstat (limited to 'gdb/testsuite/gdb.threads')
-rw-r--r-- | gdb/testsuite/gdb.threads/signal-sigtrap.c | 46 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/signal-sigtrap.exp | 67 |
2 files changed, 113 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.threads/signal-sigtrap.c b/gdb/testsuite/gdb.threads/signal-sigtrap.c new file mode 100644 index 0000000..4513d38 --- /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 <http://www.gnu.org/licenses/>. */ + +#include <unistd.h> +#include <stdlib.h> +#include <pthread.h> +#include <signal.h> + +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 0000000..c535da6 --- /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 <http://www.gnu.org/licenses/>. */ + +# 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 +} |