From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14213 invoked by alias); 5 Nov 2004 20:39: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 14206 invoked from network); 5 Nov 2004 20:39:00 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 5 Nov 2004 20:39:00 -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 iA5Kd0c8017482 for ; Fri, 5 Nov 2004 15:39:00 -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 iA5Kd0r14139 for ; Fri, 5 Nov 2004 15:39:00 -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 iA5Kd0bU011290 for ; Fri, 5 Nov 2004 15:39:00 -0500 Received: from redhat.com (toocool.toronto.redhat.com [172.16.14.72]) by touchme.toronto.redhat.com (Postfix) with ESMTP id 004B580035F for ; Fri, 5 Nov 2004 15:39:00 -0500 (EST) Message-ID: <418BE4E3.6060504@redhat.com> Date: Fri, 05 Nov 2004 20:39: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: gdb-patches@sources.redhat.com Subject: [RFA]: test for backtrace failures in macro Content-Type: multipart/mixed; boundary="------------070207090908030408090601" X-SW-Source: 2004-11/txt/msg00091.txt.bz2 This is a multi-part message in MIME format. --------------070207090908030408090601 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 385 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. Ok to commit? -- Jeff J. 2004-11-05 Jeff Johnston * gdb.threads/macrothreads.exp: New test. * gdb.threads/macrothreads.c: New file. --------------070207090908030408090601 Content-Type: text/plain; name="backtracetest.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="backtracetest.patch" Content-length: 5181 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" + --------------070207090908030408090601--