From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 37642 invoked by alias); 5 Mar 2015 13:10:41 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 37632 invoked by uid 89); 5 Mar 2015 13:10:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.2 required=5.0 tests=AWL,BAYES_00,SPF_PASS autolearn=ham version=3.3.2 X-HELO: usevmg20.ericsson.net Received: from usevmg20.ericsson.net (HELO usevmg20.ericsson.net) (198.24.6.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Thu, 05 Mar 2015 13:10:35 +0000 Received: from EUSAAHC001.ericsson.se (Unknown_Domain [147.117.188.75]) by usevmg20.ericsson.net (Symantec Mail Security) with SMTP id 45.02.16061.80108F45; Thu, 5 Mar 2015 08:08:56 +0100 (CET) Received: from [142.133.110.95] (147.117.188.8) by smtp-am.internal.ericsson.com (147.117.188.77) with Microsoft SMTP Server id 14.3.210.2; Thu, 5 Mar 2015 08:10:31 -0500 Message-ID: <54F855C7.7040400@ericsson.com> Date: Thu, 05 Mar 2015 13:10:00 -0000 From: Antoine Tremblay User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Subject: Re: [PATCH] Fix breakpoint thread condition missing with mi and a pending breakpoint. References: <1424459190-11010-1-git-send-email-antoine.tremblay@ericsson.com> In-Reply-To: <1424459190-11010-1-git-send-email-antoine.tremblay@ericsson.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2015-03/txt/msg00151.txt.bz2 ping... On 02/20/2015 02:06 PM, Antoine Tremblay wrote: > When setting a pending breakpoint with a thread condition while using > the mi interface, the thread condition would be lost by gdb when the breakpoint > was resolved. > > This patch fixes this behavior by setting the thread condition properly in the > mi case. > > Also, this patch modifies the mi-pending test case to test for this issue and > removes some unneeded code in the testcase and dependency on stdio. > > gdb/Changelog: > PR breakpoints/16466 > * breakpoint.c (create_breakpoint): Set thread on breakpoint struct. > > gdb/testsuite/ChangeLog: > PR breakpoints/16466 > * gdb.mi/Makefile.in: Add mi-pendshr2.sl to cleanup. > * gdb.mi/mi-pending.c (thread_func): Add simple > thread function. > (int main): Added threading support required. > * gdb.mi/mi-pending.exp: Added tests for this issue. > * gdb.mi/mi-pendshr.c (pendfunc1): Removed stdio dependency. > (pendfunc2): Removed stdio dependency. > * gdb.mi/mi-pendshr2.c: New file. > --- > gdb/breakpoint.c | 1 + > gdb/testsuite/gdb.mi/Makefile.in | 2 +- > gdb/testsuite/gdb.mi/mi-pending.c | 42 +++++++++++++++++--- > gdb/testsuite/gdb.mi/mi-pending.exp | 72 +++++++++++++++++++++++++++++------ > gdb/testsuite/gdb.mi/mi-pendshr.c | 13 +++---- > gdb/testsuite/gdb.mi/mi-pendshr2.c | 21 ++++++++++ > 6 files changed, 126 insertions(+), 25 deletions(-) > create mode 100644 gdb/testsuite/gdb.mi/mi-pendshr2.c > > diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c > index acf1ecf..778a01e 100644 > --- a/gdb/breakpoint.c > +++ b/gdb/breakpoint.c > @@ -10159,6 +10159,7 @@ create_breakpoint (struct gdbarch *gdbarch, > make_cleanup (xfree, cond_string); > } > b->cond_string = cond_string; > + b->thread = thread; > } > b->extra_string = NULL; > b->ignore_count = ignore_count; > diff --git a/gdb/testsuite/gdb.mi/Makefile.in b/gdb/testsuite/gdb.mi/Makefile.in > index 661add2..2ea819d 100644 > --- a/gdb/testsuite/gdb.mi/Makefile.in > +++ b/gdb/testsuite/gdb.mi/Makefile.in > @@ -16,7 +16,7 @@ PROGS = basics c_variable cpp_variable var-cmd dw2-ref-missing-frame \ > mi2-var-block mi2-var-child mi2-var-cmd mi2-var-display \ > mi2-watch until > > -MISCELLANEOUS = mi-pendshr.sl > +MISCELLANEOUS = mi-pendshr.sl mi-pendshr2.sl > > all info install-info dvi install uninstall installcheck check: > @echo "Nothing to be done for $@..." > diff --git a/gdb/testsuite/gdb.mi/mi-pending.c b/gdb/testsuite/gdb.mi/mi-pending.c > index 21a2165..7d1b7ae 100644 > --- a/gdb/testsuite/gdb.mi/mi-pending.c > +++ b/gdb/testsuite/gdb.mi/mi-pending.c > @@ -15,17 +15,49 @@ > You should have received a copy of the GNU General Public License > along with this program. If not, see . */ > > -#include > +#include > +#include > > -int k = 0; > +#define NUM 2 > > extern void pendfunc (int x); > > +void* > +thread_func (void* arg) > +{ > + const char *libname = "mi-pendshr2.sl"; > + void *h; > + int (*p_func) (); > + > + h = dlopen (libname, RTLD_LAZY); /* set breakpoint here */ > + if (h == NULL) return; > + > + p_func = dlsym (h, "pendfunc3"); > + if (p_func == NULL) return; > + > + (*p_func) (); > +} > + > int main() > { > - pendfunc (3); /* break main here */ > - pendfunc (4); > - k = 1; > + int res; > + pthread_t threads[NUM]; > + int i; > + > pendfunc (3); > + pendfunc (4); > + > + for (i = 0; i < NUM; i++) > + { > + res = pthread_create(&threads[i], > + NULL, > + &thread_func, > + NULL); > + } > + > + for (i = 0; i < NUM; i++) { > + res = pthread_join(threads[i], NULL); > + } > + > return 0; > } > diff --git a/gdb/testsuite/gdb.mi/mi-pending.exp b/gdb/testsuite/gdb.mi/mi-pending.exp > index a5d1c5b..3621f47 100644 > --- a/gdb/testsuite/gdb.mi/mi-pending.exp > +++ b/gdb/testsuite/gdb.mi/mi-pending.exp > @@ -24,29 +24,39 @@ if {[skip_shlib_tests]} { > return 0 > } > > -standard_testfile mi-pending.c mi-pendshr.c > -set lib_sl [standard_output_file mi-pendshr.sl] > +standard_testfile mi-pending.c > > -set lib_opts debug > -set exec_opts [list debug shlib=$lib_sl] > +set libfile1 "mi-pendshr" > +set libfile2 "mi-pendshr2" > +set libsrc1 $srcdir/$subdir/$libfile1.c > +set libsrc2 $srcdir/$subdir/$libfile2.c > +set lib_sl1 [standard_output_file $libfile1.sl] > +set lib_sl2 [standard_output_file $libfile2.sl] > +set lib_opts debug > +set exec_opts [list debug shlib=$lib_sl1 shlib_load] > > if [get_compiler_info] { > return -1 > } > > -if { [gdb_compile_shlib $srcdir/$subdir/$srcfile2 $lib_sl $lib_opts] != "" > - || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} { > - untested "Could not compile either $libsrc or $srcdir/$subdir/$srcfile." > +if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != "" > + || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""} { > + untested "Could not compile either $libsrc1 or $libsrc2" > return -1 > } > > -# Start with a fresh gdb. > +if { [gdb_compile_pthreads $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} { > + untested "Could not compile $srcdir/$subdir/$srcfile." > + return -1 > +} > > +# Start with a fresh gdb. > gdb_exit > mi_gdb_start > mi_gdb_reinitialize_dir $srcdir/$subdir > mi_gdb_load ${binfile} > -mi_load_shlibs $lib_sl > +mi_load_shlibs $lib_sl1 > +mi_load_shlibs $lib_sl2 > > # Set pending breakpoint via MI. > mi_gdb_test "-break-insert -f pendfunc1" \ > @@ -54,23 +64,61 @@ mi_gdb_test "-break-insert -f pendfunc1" \ > "MI pending breakpoint on pendfunc1" > > # Set pending breakpoint with a condition via MI. > -mi_gdb_test "-break-insert -f -c x==4 ${srcfile2}:pendfunc2" \ > - ".*\\^done,bkpt=\{number=\"2\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"\",pending=\"${srcfile2}:pendfunc2\",cond=\"x==4\",times=\"0\",original-location=\"${srcfile2}:pendfunc2\"\}"\ > - "MI pending breakpoint on ${srcfile2}:pendfunc2 if x==4" > +mi_gdb_test "-break-insert -f -c x==4 ${libsrc1}:pendfunc2" \ > + ".*\\^done,bkpt=\{number=\"2\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"\",pending=\"${libsrc1}:pendfunc2\",cond=\"x==4\",times=\"0\",original-location=\"${libsrc1}:pendfunc2\"\}"\ > + "MI pending breakpoint on ${libsrc1}:pendfunc2 if x==4" > + > +# Set breakpoint so that we can stop when the thread is created > +mi_gdb_test "-break-insert -f thread_func" \ > + ".*\\^done,bkpt=\{number=\"3\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"${hex}\",func=\"thread_func\".*\}"\ > + "MI pending breakpoint on thread_func" > > mi_run_cmd > + > mi_expect_stop "breakpoint-hit" "pendfunc1" ".*" ".*" ".*" \ > { "" "disp=\"keep\"" } \ > "Run till MI pending breakpoint on pendfunc1" > > mi_send_resuming_command "exec-continue" "continuing execution to skip conditional bp" > + > # We should not stop on the conditional breakpoint yet, but we stop on the original bp. > mi_expect_stop "breakpoint-hit" "pendfunc1" ".*" ".*" ".*" \ > { "" "disp=\"keep\"" } \ > "Run till MI pending breakpoint on pendfunc1 a second time" > > mi_send_resuming_command "exec-continue" "continuing execution to conditional bp" > + > # Now we should stop on the conditional breakpoint. > mi_expect_stop "breakpoint-hit" "pendfunc2" "\{name=\"x\",value=\"4\"\}" ".*" ".*" \ > { "" "disp=\"keep\"" } \ > "Run till MI pending breakpoint on pendfunc2 with x==4" > + > +mi_send_resuming_command "exec-continue" "continuing execution to thread creation" > + > +# Stop on thread creation so we can set a pending breakpoint with a thread cond. > +mi_expect_stop "breakpoint-hit" "thread_func" ".*" ".*" ".*" \ > + { "" "disp=\"keep\"" } \ > + "Run till MI pending breakpoint on thread_func" > + > +# Delete thread creation breakpoint to enable more then 1 thread to be created. > +mi_gdb_test "-break-delete 3" ".*" "" > + > +# Set pending breakpoint with a thread via MI. > +mi_gdb_test "-break-insert -p 2 -f pendfunc3" \ > + ".*\\^done,bkpt=\{number=\"4\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"\",pending=\"pendfunc3\",thread=\"2\",thread=\"2\",times=\"0\",original-location=\"pendfunc3\"\}"\ > + "MI pending breakpoint on pendfunc3" > + > +mi_send_resuming_command "exec-continue" "continuing execution to thread condition" > + > +# Check if we stopped in thread 2 like we should. > +set testname "Run till MI pending breakpoint on pendfunc3 on thread 2" > +gdb_expect 5 { > + -re "\\*stopped,reason=\"breakpoint-hit\",disp=\"keep\",bkptno=\"4\",frame=\{addr=\"$hex\",func=\"pendfunc3\".*thread-id=\"2\".*" { > + pass $testname > + return 0 > + } > + timeout { > + fail "$testname (timeout)" > + return -1 > + } > +} > diff --git a/gdb/testsuite/gdb.mi/mi-pendshr.c b/gdb/testsuite/gdb.mi/mi-pendshr.c > index 05c88af..2dce1fe 100644 > --- a/gdb/testsuite/gdb.mi/mi-pendshr.c > +++ b/gdb/testsuite/gdb.mi/mi-pendshr.c > @@ -15,20 +15,19 @@ > You should have received a copy of the GNU General Public License > along with this program. If not, see . */ > > -#include > - > -void pendfunc1 (int x) > +void > +pendfunc1 (int x) > { > int y = x + 4; > - printf ("in pendfunc1, x is %d\n", x); > } > > -void pendfunc2 (int x) > +void > +pendfunc2 (int x) > { > - printf ("in pendfunc2, x is %d\n", x); > } > > -void pendfunc (int x) > +void > +pendfunc (int x) > { > pendfunc1 (x); > pendfunc2 (x); > diff --git a/gdb/testsuite/gdb.mi/mi-pendshr2.c b/gdb/testsuite/gdb.mi/mi-pendshr2.c > new file mode 100644 > index 0000000..915d647 > --- /dev/null > +++ b/gdb/testsuite/gdb.mi/mi-pendshr2.c > @@ -0,0 +1,21 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2015 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 3 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, see . */ > + > +void > +pendfunc3 (void) > +{ > +} >