From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25947 invoked by alias); 20 Nov 2003 07:35:01 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 25932 invoked from network); 20 Nov 2003 07:34:58 -0000 Received: from unknown (HELO takamaka.act-europe.fr) (142.179.108.108) by sources.redhat.com with SMTP; 20 Nov 2003 07:34:58 -0000 Received: by takamaka.act-europe.fr (Postfix, from userid 507) id 3A801482A3; Wed, 19 Nov 2003 23:34:58 -0800 (PST) Date: Thu, 20 Nov 2003 07:35:00 -0000 From: Joel Brobecker To: gdb-patches@sources.redhat.com Subject: [RFA/testsuite] backtrace past pthread_cond_wait() Message-ID: <20031120073458.GE504@gnat.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="qjNfmADvan18RZcF" Content-Disposition: inline User-Agent: Mutt/1.4i X-SW-Source: 2003-11/txt/msg00418.txt.bz2 --qjNfmADvan18RZcF Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 732 Hello, Re: http://sources.redhat.com/ml/gdb-patches/2003-10/msg00440.html Here is a new test that would verify that GDB is able to unwind past pthread_cond_wait(). On my laptop, I get all PASS, while on a RH9.0 machine I get one FAIL. I am not too familiar with pthreads, so I hope my program is portable. In particular, I am worried about cygwin... Some guidance would be much appreciated (in Ada, we use tasks, which syntax and behavior is defined by the Ada Reference Manual, so the issue about portability is left to the compiler/runtime developers). 2003-11-19 J. Brobecker * gdb.threads/pt.c: New file. * gdb.threads/pthread_cond_wait.exp: New test. OK to apply? Thanks, -- Joel --qjNfmADvan18RZcF Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="pt.c" Content-length: 1712 /* A small multi-threaded test case. Copyright 2003 Free Software Foundation, Inc. This file is part of GDB. 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include void cond_wait (pthread_cond_t *cond, pthread_mutex_t *mut) { pthread_mutex_lock(mut); pthread_cond_wait (cond, mut); pthread_mutex_unlock (mut); } void noreturn (void) { pthread_mutex_t mut; pthread_cond_t cond; pthread_mutex_init (&mut, NULL); pthread_cond_init (&cond, NULL); /* Wait for a condition that will never be signaled, so we effectively block the thread here. */ cond_wait (&cond, &mut); } void * forever_pthread (void *unused) { noreturn (); } void break_me (void) { /* Just an anchor to help putting a breakpoint. */ } int main (void) { pthread_t forever; const struct timespec ts = { 0, 10000000 }; /* 0.01 sec */ pthread_create (&forever, NULL, forever_pthread, NULL); for (;;) { nanosleep (&ts, NULL); break_me(); } return 0; } --qjNfmADvan18RZcF Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="pthread_cond_wait.exp" Content-length: 2572 # Copyright (C) 2003 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 2 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Please email any bugs, comments, and/or additions to this file to: # bug-gdb@gnu.org # This file was written by Joel Brobecker. # # It verifies that GDB is able to compute a backtrace for a thread # being blocked on a call to pthread_cond_wait(). if $tracelevel then { strace $tracelevel } set testfile "pt" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}"]] != "" } { return -1 } gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} gdb_test "break break_me" \ "Breakpoint 1 at .*: file .*pt.c, line .*" \ "breakpoint on break_me" gdb_test "run" \ ".*Breakpoint 1, break_me ().*" \ "run to break_me" # Depending on the thread implementation (Linux Threads, NPTL, etc...), # The number of threads known to GDB may vary. We should have at least # two threads, but we may have more. We want to switch to the pthread # we created via pthread_create, and its ID should be the highest ID # of all threads known to GDB. set thread_id "" send_gdb "info threads\n" gdb_expect { -re "\s*(\[0-9\]+) Thread.*$gdb_prompt $" { set thread_id $expect_out(1,string) } default { fail "Unable to find thread id, defaulting to 2" set thread_id "2" } } # Switch to thread 2, which is doing a forever wait... gdb_test "thread $thread_id" \ ".*Switching to thread $thread_id.*" \ "switching to thread $thread_id" # Verify that we are able to get a sensible backtrace, including # the frame for the pthread_cond_wait() call. gdb_test "backtrace" \ ".*pthread_cond_wait.*cond_wait.*noreturn.*forever_pthread.*" \ "backtrace in blocked thread" --qjNfmADvan18RZcF--