From patchwork Wed Apr 22 08:56:29 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 6378 Received: (qmail 64293 invoked by alias); 22 Apr 2015 08:56:37 -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 64280 invoked by uid 89); 22 Apr 2015 08:56:36 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.3 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-pa0-f41.google.com Received: from mail-pa0-f41.google.com (HELO mail-pa0-f41.google.com) (209.85.220.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Wed, 22 Apr 2015 08:56:35 +0000 Received: by paboj16 with SMTP id oj16so267297506pab.0 for ; Wed, 22 Apr 2015 01:56:33 -0700 (PDT) X-Received: by 10.66.234.233 with SMTP id uh9mr16772653pac.81.1429692993339; Wed, 22 Apr 2015 01:56:33 -0700 (PDT) Received: from E107787-LIN.cambridge.arm.com (gcc1-power7.osuosl.org. [140.211.15.137]) by mx.google.com with ESMTPSA id m8sm4399080pdn.5.2015.04.22.01.56.32 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 22 Apr 2015 01:56:32 -0700 (PDT) From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH] Skip gdb.base/relativedebug.exp if libc doesn't have debug info Date: Wed, 22 Apr 2015 09:56:29 +0100 Message-Id: <1429692989-10646-1-git-send-email-qiyaoltc@gmail.com> X-IsSubscribed: yes From: Yao Qi Hi, I see the fail in gdb.base/relativedebug.exp on aarch64 box on which glibc doesn't have debug info, bt^M #0 0x0000002000061a88 in raise () from /lib/aarch64-linux-gnu/libc.so.6^M #1 0x0000002000064efc in abort () from /lib/aarch64-linux-gnu/libc.so.6^M #2 0x0000000000400640 in handler (signo=14) at ../../../binutils-gdb/gdb/testsuite/gdb.base/relativedebug.c:25^M #3 ^M #4 0x00000020000cc478 in ?? () from /lib/aarch64-linux-gnu/libc.so.6^M #5 0x0000000000400664 in main () at ../../../binutils-gdb/gdb/testsuite/gdb.base/relativedebug.c:32^M (gdb) FAIL: gdb.base/relativedebug.exp: pause found in backtrace if glibc has debug info, this test doesn't fail. In sysdeps/unix/sysv/linux/generic/pause.c, __libc_pause calls __syscall_pause, static int __syscall_pause (void) { sigset_t set; int rc = INLINE_SYSCALL (rt_sigprocmask, 4, SIG_BLOCK, NULL, &set, _NSIG / 8); if (rc == 0) rc = INLINE_SYSCALL (rt_sigsuspend, 2, &set, _NSIG / 8); return rc; } int __libc_pause (void) { if (SINGLE_THREAD_P) return __syscall_pause (); <--- tail call int oldtype = LIBC_CANCEL_ASYNC (); int result = __syscall_pause (); LIBC_CANCEL_RESET (oldtype); return result; } and GDB unwinder is confused by the GCC optimized code, (gdb) disassemble pause Dump of assembler code for function pause: 0x0000007fb7f274c4 <+0>: stp x29, x30, [sp,#-32]! 0x0000007fb7f274c8 <+4>: mov x29, sp 0x0000007fb7f274cc <+8>: adrp x0, 0x7fb7fd2000 0x0000007fb7f274d0 <+12>: ldr w0, [x0,#364] 0x0000007fb7f274d4 <+16>: stp x19, x20, [sp,#16] 0x0000007fb7f274d8 <+20>: cbnz w0, 0x7fb7f274e8 0x0000007fb7f274dc <+24>: ldp x19, x20, [sp,#16] 0x0000007fb7f274e0 <+28>: ldp x29, x30, [sp],#32 0x0000007fb7f274e4 <+32>: b 0x7fb7f27434 <---- __syscall_pause 0x0000007fb7f274e8 <+36>: bl 0x7fb7f5e080 Note that the program stops in __syscall_pause, but its symbol is stripped in glibc, so GDB doesn't know where the program stops. __syscall_pause is a tail call in __libc_pause, so it returns to main instead of __libc_pause. As a result, the backtrace is like, #0 0x0000007fb7ebca88 in raise () from /lib/aarch64-linux-gnu/libc.so.6 #1 0x0000007fb7ebfefc in abort () from /lib/aarch64-linux-gnu/libc.so.6 #2 0x0000000000400640 in handler (signo=14) at ../../../binutils-gdb/gdb/testsuite/gdb.base/relativedebug.c:25 #3 #4 0x0000007fb7f27478 in ?? () from /lib/aarch64-linux-gnu/libc.so.6 <-- [in __syscall_pause] #5 0x0000000000400664 in main () at ../../../binutils-gdb/gdb/testsuite/gdb.base/relativedebug.c:32 looks GDB does nothing wrong here. I looked back at the test case gdb.base/relativedebug.exp, which was added https://sourceware.org/ml/gdb-patches/2006-10/msg00305.html This test was indented to test the problem that "backtraces no longer display some libc functions" after separate debug info is installed. IOW, it makes few sense to test against libc which doesn't have debug info at all, such as my case. This patch is to tweak the test case to catch the output of "info shared", if "(*)" is found for libc.so, which means libc doesn't have debug info, then skip the test. gdb/testsuite: 2015-04-22 Yao Qi * gdb.base/relativedebug.exp: Invoke gdb command "info sharedlibrary", and if libc.so doesn't have debug info, skip the test. --- gdb/testsuite/gdb.base/relativedebug.exp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gdb/testsuite/gdb.base/relativedebug.exp b/gdb/testsuite/gdb.base/relativedebug.exp index 621226b..b42dbf9 100644 --- a/gdb/testsuite/gdb.base/relativedebug.exp +++ b/gdb/testsuite/gdb.base/relativedebug.exp @@ -31,6 +31,17 @@ clean_restart ${binfile} runto_main +set test "info sharedlibrary" +gdb_test_multiple $test $test { + -re ".*\(\\*\)\[^\r\n\]*/libc\.so.*$gdb_prompt $" { + # Skip the test below if libc doesn't have debug info. + unsupported "libc doesn't have debug info" + return -1 + } + -re ".*$gdb_prompt $" { + } +} + # pause () -> SIGALRM -> handler () -> abort () gdb_test "continue" "Program received signal SIGABRT.*"