public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Fix breakpoint thread condition missing with mi and a pending breakpoint.
@ 2015-02-20 19:06 Antoine Tremblay
  2015-03-05 13:10 ` Antoine Tremblay
  2015-03-06 19:38 ` Pedro Alves
  0 siblings, 2 replies; 8+ messages in thread
From: Antoine Tremblay @ 2015-02-20 19:06 UTC (permalink / raw)
  To: gdb-patches; +Cc: Antoine Tremblay

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 <http://www.gnu.org/licenses/>.  */
 
-#include <stdio.h>
+#include <dlfcn.h>
+#include <pthread.h>
 
-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>\",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>\",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>\",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 <http://www.gnu.org/licenses/>.  */
 
-#include <stdio.h>
-
-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 <http://www.gnu.org/licenses/>.  */
+
+void
+pendfunc3 (void)
+{
+}
-- 
1.7.9.5

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Fix breakpoint thread condition missing with mi and a pending breakpoint.
  2015-02-20 19:06 [PATCH] Fix breakpoint thread condition missing with mi and a pending breakpoint Antoine Tremblay
@ 2015-03-05 13:10 ` Antoine Tremblay
  2015-03-06 19:38 ` Pedro Alves
  1 sibling, 0 replies; 8+ messages in thread
From: Antoine Tremblay @ 2015-03-05 13:10 UTC (permalink / raw)
  To: gdb-patches

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 <http://www.gnu.org/licenses/>.  */
>
> -#include <stdio.h>
> +#include <dlfcn.h>
> +#include <pthread.h>
>
> -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>\",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>\",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>\",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 <http://www.gnu.org/licenses/>.  */
>
> -#include <stdio.h>
> -
> -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 <http://www.gnu.org/licenses/>.  */
> +
> +void
> +pendfunc3 (void)
> +{
> +}
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Fix breakpoint thread condition missing with mi and a pending breakpoint.
  2015-02-20 19:06 [PATCH] Fix breakpoint thread condition missing with mi and a pending breakpoint Antoine Tremblay
  2015-03-05 13:10 ` Antoine Tremblay
@ 2015-03-06 19:38 ` Pedro Alves
  2015-03-23 15:29   ` [PATCH v2] " Antoine Tremblay
  1 sibling, 1 reply; 8+ messages in thread
From: Pedro Alves @ 2015-03-06 19:38 UTC (permalink / raw)
  To: Antoine Tremblay, gdb-patches

On 02/20/2015 07: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.

Took me a bit to figure why this was MI specific.  It's because on the CLI
case, the thread is instead parsed from ARG.

> 
> 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/Makefile.in (MISCELLANEOUS): Add mi-pendshr2.sl.


> 	* gdb.mi/mi-pending.c (thread_func): Add simple
> 	thread function.

"New function."

> 	(int main): Added threading support required.

 	(NUM): New define.
 	(main): Create two threads.

(I almost requested to create a separate test instead, so that
the original test would still work against targets that
don't do threads, but then, the test relies on shared libraries,
and targets that don't do threads won't be doing those either.)

> 	* 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.

s/Added/Add
s/Removed/Remove

> ---
>  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 <http://www.gnu.org/licenses/>.  */
>  
> -#include <stdio.h>
> +#include <dlfcn.h>
> +#include <pthread.h>
>  
> -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;

Please put the "return" statements on their own lines.

> +
> +  (*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);

Space before parens.

> +    }
> +
> +  for (i = 0; i < NUM; i++) {
> +    res = pthread_join(threads[i], NULL);

Ditto.

> +  }
> +
>    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>\",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>\",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.

"more than" ?

> +mi_gdb_test "-break-delete 3" ".*" ""
> +

Please make this regex a bit more strict.

> +# 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>\",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
> +    }
> +}

Can't this use mi_expect_stop ?

Otherwise looks good to me.

Thanks,
Pedro Alves

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2] Fix breakpoint thread condition missing with mi and a pending breakpoint.
  2015-03-06 19:38 ` Pedro Alves
@ 2015-03-23 15:29   ` Antoine Tremblay
  2015-03-23 19:52     ` Pedro Alves
  2015-03-24 17:09     ` Pedro Alves
  0 siblings, 2 replies; 8+ messages in thread
From: Antoine Tremblay @ 2015-03-23 15:29 UTC (permalink / raw)
  To: gdb-patches, palves; +Cc: Antoine Tremblay

In this patch v2:
  - comments are fixed as requested, sorry about that.
  - returns are on their own line.
  - Space before parens is fixed.
  - English errors in the test fixed.
  - mi_gdb_test "-break-delete 3" ".*" "" is now more specific : 
  mi_gdb_test "-break-delete 3" "\\^done" "Delete breakpoint 3"

>> +# 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
>> +    }
>> +}
> 
> Can't this use mi_expect_stop ?
 
 - This can't use mi_expect_stop since I can't validate the thread-id with that function.

Patch follows here :

-----

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): New function.
	(int main): Add threading support required.
	* gdb.mi/mi-pending.exp: Add tests for this issue.
	* gdb.mi/mi-pendshr.c (pendfunc1): Remove stdio dependency.
	(pendfunc2): Remove 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   | 44 ++++++++++++++++++++---
 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, 128 insertions(+), 25 deletions(-)
 create mode 100644 gdb/testsuite/gdb.mi/mi-pendshr2.c

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 13c8949..b74469e 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -9785,6 +9785,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..248c7a8 100644
--- a/gdb/testsuite/gdb.mi/mi-pending.c
+++ b/gdb/testsuite/gdb.mi/mi-pending.c
@@ -15,17 +15,51 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#include <stdio.h>
+#include <dlfcn.h>
+#include <pthread.h>
 
-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..e289cd9 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>\",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>\",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 than 1 thread to be created.
+mi_gdb_test "-break-delete 3" "\\^done" "Delete breakpoint 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>\",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 <http://www.gnu.org/licenses/>.  */
 
-#include <stdio.h>
-
-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 <http://www.gnu.org/licenses/>.  */
+
+void
+pendfunc3 (void)
+{
+}
-- 
1.9.1

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] Fix breakpoint thread condition missing with mi and a pending breakpoint.
  2015-03-23 15:29   ` [PATCH v2] " Antoine Tremblay
@ 2015-03-23 19:52     ` Pedro Alves
  2015-03-24 17:09     ` Pedro Alves
  1 sibling, 0 replies; 8+ messages in thread
From: Pedro Alves @ 2015-03-23 19:52 UTC (permalink / raw)
  To: Antoine Tremblay, gdb-patches

On 03/23/2015 03:29 PM, Antoine Tremblay wrote:
> In this patch v2:
>   - comments are fixed as requested, sorry about that.
>   - returns are on their own line.
>   - Space before parens is fixed.
>   - English errors in the test fixed.
>   - mi_gdb_test "-break-delete 3" ".*" "" is now more specific : 
>   mi_gdb_test "-break-delete 3" "\\^done" "Delete breakpoint 3"

OK.

Thanks,
Pedro Alves

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] Fix breakpoint thread condition missing with mi and a pending breakpoint.
  2015-03-23 15:29   ` [PATCH v2] " Antoine Tremblay
  2015-03-23 19:52     ` Pedro Alves
@ 2015-03-24 17:09     ` Pedro Alves
  2015-03-24 17:32       ` [PATCH] Fix mi-pending.exp test output to allow stable test diffing Antoine Tremblay
  1 sibling, 1 reply; 8+ messages in thread
From: Pedro Alves @ 2015-03-24 17:09 UTC (permalink / raw)
  To: Antoine Tremblay, gdb-patches

Hi Antoine,

I noticed this on current mainline compared to a few days old gdb.sum:

 PASS: gdb.mi/mi-pending.exp: MI pending breakpoint on pendfunc1
-PASS: gdb.mi/mi-pending.exp: MI pending breakpoint on mi-pendshr.c:pendfunc2 if x==4
+PASS: gdb.mi/mi-pending.exp: MI pending breakpoint on /home/pedro/gdb/mygit/src/gdb/testsuite/gdb.mi/mi-pendshr.c:pendfunc2 if x==4
+PASS: gdb.mi/mi-pending.exp: MI pending breakpoint on thread_func

Could you tweak that to avoid having the full source path in gdb.sum, please?
That's necessary for stable test results diffing.

Thanks,
Pedro Alves

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH] Fix mi-pending.exp test output to allow stable test diffing
  2015-03-24 17:09     ` Pedro Alves
@ 2015-03-24 17:32       ` Antoine Tremblay
  2015-03-24 17:47         ` Pedro Alves
  0 siblings, 1 reply; 8+ messages in thread
From: Antoine Tremblay @ 2015-03-24 17:32 UTC (permalink / raw)
  To: gdb-patches, palves; +Cc: Antoine Tremblay

/* Not part of the commit comment 
This gives the following output :
PASS: gdb.mi/mi-pending.exp: MI pending breakpoint on mi-pendshr.c:pendfunc2 if x==4
*/

gdb/testsuite/ChangeLog:

	* gdb.mi/mi-pending.exp: Fix output of breakpoint test.
---
 gdb/testsuite/gdb.mi/mi-pending.exp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gdb/testsuite/gdb.mi/mi-pending.exp b/gdb/testsuite/gdb.mi/mi-pending.exp
index e289cd9..88c6870 100644
--- a/gdb/testsuite/gdb.mi/mi-pending.exp
+++ b/gdb/testsuite/gdb.mi/mi-pending.exp
@@ -66,7 +66,7 @@ mi_gdb_test "-break-insert -f pendfunc1" \
 # Set pending breakpoint with a condition via MI.
 mi_gdb_test "-break-insert -f -c x==4 ${libsrc1}:pendfunc2" \
     ".*\\^done,bkpt=\{number=\"2\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"<PENDING>\",pending=\"${libsrc1}:pendfunc2\",cond=\"x==4\",times=\"0\",original-location=\"${libsrc1}:pendfunc2\"\}"\
-    "MI pending breakpoint on ${libsrc1}:pendfunc2 if x==4"
+    "MI pending breakpoint on ${libfile1}.c:pendfunc2 if x==4"
 
 # Set breakpoint so that we can stop when the thread is created
 mi_gdb_test "-break-insert -f thread_func" \
-- 
1.9.1

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Fix mi-pending.exp test output to allow stable test diffing
  2015-03-24 17:32       ` [PATCH] Fix mi-pending.exp test output to allow stable test diffing Antoine Tremblay
@ 2015-03-24 17:47         ` Pedro Alves
  0 siblings, 0 replies; 8+ messages in thread
From: Pedro Alves @ 2015-03-24 17:47 UTC (permalink / raw)
  To: Antoine Tremblay, gdb-patches

Thanks.  Please push.

Thanks,
Pedro Alves

On 03/24/2015 05:32 PM, Antoine Tremblay wrote:
> /* Not part of the commit comment 
> This gives the following output :
> PASS: gdb.mi/mi-pending.exp: MI pending breakpoint on mi-pendshr.c:pendfunc2 if x==4
> */
> 
> gdb/testsuite/ChangeLog:
> 
> 	* gdb.mi/mi-pending.exp: Fix output of breakpoint test.
> ---
>  gdb/testsuite/gdb.mi/mi-pending.exp | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/gdb/testsuite/gdb.mi/mi-pending.exp b/gdb/testsuite/gdb.mi/mi-pending.exp
> index e289cd9..88c6870 100644
> --- a/gdb/testsuite/gdb.mi/mi-pending.exp
> +++ b/gdb/testsuite/gdb.mi/mi-pending.exp
> @@ -66,7 +66,7 @@ mi_gdb_test "-break-insert -f pendfunc1" \
>  # Set pending breakpoint with a condition via MI.
>  mi_gdb_test "-break-insert -f -c x==4 ${libsrc1}:pendfunc2" \
>      ".*\\^done,bkpt=\{number=\"2\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"<PENDING>\",pending=\"${libsrc1}:pendfunc2\",cond=\"x==4\",times=\"0\",original-location=\"${libsrc1}:pendfunc2\"\}"\
> -    "MI pending breakpoint on ${libsrc1}:pendfunc2 if x==4"
> +    "MI pending breakpoint on ${libfile1}.c:pendfunc2 if x==4"
>  
>  # Set breakpoint so that we can stop when the thread is created
>  mi_gdb_test "-break-insert -f thread_func" \
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-03-24 17:47 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-20 19:06 [PATCH] Fix breakpoint thread condition missing with mi and a pending breakpoint Antoine Tremblay
2015-03-05 13:10 ` Antoine Tremblay
2015-03-06 19:38 ` Pedro Alves
2015-03-23 15:29   ` [PATCH v2] " Antoine Tremblay
2015-03-23 19:52     ` Pedro Alves
2015-03-24 17:09     ` Pedro Alves
2015-03-24 17:32       ` [PATCH] Fix mi-pending.exp test output to allow stable test diffing Antoine Tremblay
2015-03-24 17:47         ` Pedro Alves

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).