From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19328 invoked by alias); 11 Nov 2004 16:54:18 -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 19230 invoked from network); 11 Nov 2004 16:54:05 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 11 Nov 2004 16:54:05 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iABGs3AJ006810 for ; Thu, 11 Nov 2004 11:54:04 -0500 Received: from localhost.redhat.com (to-dhcp51.toronto.redhat.com [172.16.14.151]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iABGs3r03837; Thu, 11 Nov 2004 11:54:03 -0500 Received: from [127.0.0.1] (localhost.localdomain [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 4AAAF129D8C; Thu, 11 Nov 2004 11:52:54 -0500 (EST) Message-ID: <419398E2.10602@gnu.org> Date: Thu, 11 Nov 2004 16:54:00 -0000 From: Andrew Cagney User-Agent: Mozilla Thunderbird 0.8 (X11/20041020) MIME-Version: 1.0 To: Jeff Johnston Cc: gdb-patches@sources.redhat.com Subject: Re: [RFA]: test for backtrace failures in macro References: <418BE4E3.6060504@redhat.com> In-Reply-To: <418BE4E3.6060504@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2004-11/txt/msg00232.txt.bz2 Jeff Johnston wrote: > The following is a test for the change I recently made to allow macros > to continue operating even after a backtrace failure occurs. > > Tested on x86-linux with linuxthreads and ia64-linux with nptl threads. Can you think of an alternative to "macro" as the prefix? "macro" can also refer to: #define MACRO (If I new of one, I'd suggest it :-) With a better name, ok. Andrew > 2004-11-05 Jeff Johnston > > * gdb.threads/macrothreads.exp: New test. > * gdb.threads/macrothreads.c: New file. > > > ------------------------------------------------------------------------ > > Index: gdb.threads/macrothreads.c > =================================================================== > RCS file: gdb.threads/macrothreads.c > diff -N gdb.threads/macrothreads.c > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ gdb.threads/macrothreads.c 5 Nov 2004 20:38:14 -0000 > @@ -0,0 +1,82 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2002, 2003, 2004 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. > + > + This file is copied from schedlock.c. */ > + > +#include > +#include > +#include > +#include > + > +void *thread_function(void *arg); /* Pointer to function executed by each thread */ > + > +#define NUM 5 > + > +unsigned int args[NUM+1]; > + > +int main() { > + int res; > + int all_started; > + pthread_t threads[NUM]; > + void *thread_result; > + long i; > + > + for (i = 0; i < NUM; i++) > + { > + args[i] = 1; /* Init value. */ > + res = pthread_create(&threads[i], > + NULL, > + thread_function, > + (void *) i); > + } > + > + all_started = 0; > + while (!all_started) > + { > + all_started = 1; > + for (i = 0; i < NUM; i++) > + { > + if (args[i] == 1) > + { > + all_started = 0; > + break; > + } > + } > + } > + > + args[i] = 1; > + /* Break here */ > + thread_function ((void *) i); > + > + exit(EXIT_SUCCESS); > +} > + > +void *thread_function(void *arg) { > + int my_number = (long) arg; > + int *myp = (int *) &args[my_number]; > + > + /* Don't run forever. Run just short of it :) */ > + while (*myp > 0) > + { > + (*myp) ++; /* Loop increment. */ > + } > + > + pthread_exit(NULL); > +} > + > Index: gdb.threads/macrothreads.exp > =================================================================== > RCS file: gdb.threads/macrothreads.exp > diff -N gdb.threads/macrothreads.exp > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ gdb.threads/macrothreads.exp 5 Nov 2004 20:38:14 -0000 > @@ -0,0 +1,76 @@ > +# This testcase is part of GDB, the GNU debugger. > + > +# Copyright 2004 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. > + > +# Check that GDB can support multiple watchpoints across threads. > + > +if $tracelevel { > + strace $tracelevel > +} > + > +set prms_id 0 > +set bug_id 0 > + > +# This test verifies that a macro using backtrace can be applied to all threads > +# and will continue for each thread even though an error may occur in > +# backtracing one of the threads. > +if [target_info exists gdb,no_hardware_watchpoints] { > + return 0; > +} > + > +set testfile "macrothreads" > +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} > + > +# > +# Run to `main' where we begin our tests. > +# > + > +if ![runto_main] then { > + gdb_suppress_tests > +} > + > +# Break after all threads have been started. > +set break_line [gdb_get_line_number "Break here"] > +gdb_test "b $break_line" "" > +gdb_test "continue" > + > +gdb_test_multiple "define backthread" "defining macro" { > + -re "Type commands for definition of \"backthread\".\r\nEnd with a line saying just \"end\".\r\n>$" { > + gdb_test_multiple "bt\np\/x 20\nend\n" "macro details" { > + -re "$gdb_prompt $" { > + pass "macro details" > + } > + } > + pass "defining macro" > + } > +} > + > +# Cause backtraces to fail by setting a limit. This allows us to > +# verify that the macro can get past the backtrace error and perform > +# subsequent commands. > +gdb_test "set backtrace limit 3" "" > +gdb_test "thread apply all backthread" "Thread ..*\\\$1 = 0x14.*Thread ..*\\\$2 = 0x14.*Thread ..*\\\$3 = 0x14.*Thread ..*\\\$4 = 0x14.*Thread ..*\\\$5 = 0x14.*Thread ..*\\\$. = 0x14" > +