From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12629 invoked by alias); 17 Feb 2012 19:38:08 -0000 Received: (qmail 12619 invoked by uid 22791); 17 Feb 2012 19:38:06 -0000 X-SWARE-Spam-Status: No, hits=-6.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 17 Feb 2012 19:37:52 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1HJbpgQ028751 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 17 Feb 2012 14:37:51 -0500 Received: from hit-nxdomain.opendns.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q1HJbokI018090; Fri, 17 Feb 2012 14:37:50 -0500 Subject: [PATCH 2/2] gdb.threads/attach-into-signal.exp: don't rely on linux native target's internal debug output To: gdb-patches@sourceware.org From: Pedro Alves Cc: jan.kratochvil@redhat.com Date: Fri, 17 Feb 2012 19:52:00 -0000 Message-ID: <20120217193750.10029.58857.stgit@hit-nxdomain.opendns.com> In-Reply-To: <20120217193546.10029.74207.stgit@hit-nxdomain.opendns.com> References: <20120217193546.10029.74207.stgit@hit-nxdomain.opendns.com> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-02/txt/msg00376.txt.bz2 This test relies on Linux native target's debug output ("set debug lin-lwp 1"), which obviously can't work when testing against GDBserver (with the extended-remote board). This patch makes the test more generic, using only regular GDB functionality, avoiding relying on internal debug output. The test runs twice, with two variants: once non-threaded, and once threaded. SIGLARM defaults to noprint, but if we set it to print, then for the non-threaded case, when we attach and find the main thread stopping with SIGLARM, we'll see "Program received signal SIGLARM". For the threaded case, the signal is seen on the non main thread, so we won't see "Program received signal SIGLARM". Instead, we check the second thread's siginfo.si_signo. We can't use this method for the non-threaded case too, because the Linux native target when attaching finds another signal other than SIGSTOP, puts that other signal pending, and waits for the SIGSTOP, so siginfo.si_signo will always show SIGSTOP. With this, GDBserver fails the test, because it doesn't really support what's being tested here. Namely, it doesn't deliver the SIGALRM back to the inferior on detach (so the program ends up on the abort() call). I have a fix for that, but it needs a bit more cleaning up. Jan, is this okay with you? 2012-02-17 Pedro Alves * gdb.threads/attach-into-signal.exp (corefunc): Don't enable lin-lwp output. Set SIGALRM to stop. Adjust tests to not rely on gdb's internal debug output. For the non-threaded case, look for "Program received signal SIGLARM", for the threaded case, peek at the thread's siginfo. --- gdb/testsuite/gdb.threads/attach-into-signal.exp | 57 ++++++++++++++++------ 1 files changed, 41 insertions(+), 16 deletions(-) diff --git a/gdb/testsuite/gdb.threads/attach-into-signal.exp b/gdb/testsuite/gdb.threads/attach-into-signal.exp index bf4b8a0..c839339 100644 --- a/gdb/testsuite/gdb.threads/attach-into-signal.exp +++ b/gdb/testsuite/gdb.threads/attach-into-signal.exp @@ -47,7 +47,6 @@ proc corefunc { threadtype executable } { lappend pf_prefix "$threadtype:" clean_restart ${executable} - gdb_test_no_output "set debug lin-lwp 1" "" set binfile ${objdir}/${subdir}/${executable} set escapedbinfile [string_to_regexp ${objdir}/${subdir}/${executable}] @@ -57,6 +56,8 @@ proc corefunc { threadtype executable } { return -1 } + gdb_test "handle SIGALRM stop print pass" "Yes.*Yes.*Yes.*" + # Start the program running and then wait for a bit, to be sure # that it can be attached to. # Statistically there is a better chance without giving process a nice. @@ -99,27 +100,51 @@ proc corefunc { threadtype executable } { # Main test: set test "attach (pass $passes), pending signal catch" if {[gdb_test_multiple "attach $testpid" $test { - -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*Received Alarm clock.*$gdb_prompt $" { + -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*Program received signal SIGALRM.*$gdb_prompt $" { # nonthreaded: pass $test verbose -log "$test succeeded on the attempt # $attempt of $attempts" set passes [expr $passes + 1] } -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" { - # nonthreaded: - # We just lack the luck, we should try it again. - set attempt [expr $attempt + 1] - } - -re "Attaching to process $testpid.*Received Alarm clock.*$gdb_prompt $" { - # threaded: - pass $test - verbose -log "$test succeeded on the attempt # $attempt of $attempts" - set passes [expr $passes + 1] - } - -re "Attaching to process $testpid.*$gdb_prompt $" { - # threaded: - # We just lack the luck, we should try it again. - set attempt [expr $attempt - 1] + set ok 0 + + if { $threadtype == "threaded" } { + # In the threaded case, the signal is left pending + # on the second thread. Check for that by peeking + # at the thread's siginfo. SIGALRM is 14, SIGSTOP + # is 19. + + # With remote targets, we need to pull the thread + # list explicitly before GDB even knows about + # thread 2. + set test2 "pull thread list" + gdb_test_multiple "info threads" $test2 { + -re "\r\n$gdb_prompt $" { + } + } + + set test2 "thread apply 2 print \$_siginfo.si_signo" + gdb_test_multiple $test2 $test2 { + -re " = 14\r\n$gdb_prompt $" { + set ok 1 + } + -re " = 19\r\n$gdb_prompt $" { + } + } + } else { + # In the nonthreaded case, GDB should tell the + # user about having seen a signal. + } + + if { $ok == 0} { + # We just lack the luck, we should try it again. + set attempt [expr $attempt + 1] + } else { + pass $test + verbose -log "$test succeeded on the attempt # $attempt of $attempts" + set passes [expr $passes + 1] + } } }] != 0 } { break