From patchwork Tue Feb 10 19:38:37 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 5027 Received: (qmail 29768 invoked by alias); 10 Feb 2015 19:38:43 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 29755 invoked by uid 89); 10 Feb 2015 19:38:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Tue, 10 Feb 2015 19:38:41 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1AJcduJ022331 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 10 Feb 2015 14:38:39 -0500 Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1AJcbPe019494 for ; Tue, 10 Feb 2015 14:38:38 -0500 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [pushed] Add "signal SIGTRAP" test Date: Tue, 10 Feb 2015 19:38:37 +0000 Message-Id: <1423597117-17482-1-git-send-email-palves@redhat.com> 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 c1d76d6..bc4c022 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 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 . */ + +#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 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 . */ + +# 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 +}