From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31867 invoked by alias); 11 Nov 2004 19:37: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 31833 invoked from network); 11 Nov 2004 19:37:11 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 11 Nov 2004 19:37:11 -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 iABJbAUS028654 for ; Thu, 11 Nov 2004 14:37:10 -0500 Received: from pobox.toronto.redhat.com (pobox.toronto.redhat.com [172.16.14.4]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iABJb5r30368; Thu, 11 Nov 2004 14:37:05 -0500 Received: from touchme.toronto.redhat.com (IDENT:postfix@touchme.toronto.redhat.com [172.16.14.9]) by pobox.toronto.redhat.com (8.12.8/8.12.8) with ESMTP id iABJb5oS031233; Thu, 11 Nov 2004 14:37:05 -0500 Received: from redhat.com (toocool.toronto.redhat.com [172.16.14.72]) by touchme.toronto.redhat.com (Postfix) with ESMTP id 3FAF080035F; Thu, 11 Nov 2004 14:37:05 -0500 (EST) Message-ID: <4193BF61.7060909@redhat.com> Date: Thu, 11 Nov 2004 19:37:00 -0000 From: Jeff Johnston User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 MIME-Version: 1.0 To: Andrew Cagney Cc: gdb-patches@sources.redhat.com Subject: Re: [RFA]: test for backtrace failures in macro References: <418BE4E3.6060504@redhat.com> <419398E2.10602@gnu.org> In-Reply-To: <419398E2.10602@gnu.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2004-11/txt/msg00238.txt.bz2 Andrew Cagney wrote: > 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. > Will rename to threadapply.exp and threadapply.c -- Jeff J. > 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" >> + > > >