Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] bug fix for gdb 16039
@ 2013-10-16  2:18 Dave.Tian
  2013-10-16  3:31 ` Sergio Durigan Junior
  0 siblings, 1 reply; 7+ messages in thread
From: Dave.Tian @ 2013-10-16  2:18 UTC (permalink / raw)
  To: gdb-patches; +Cc: sergiodj, Dave.Tian

1 Description: Gdb bug 16039 created by me

  Title: Gdb next" command stop working when shared library unloaded.
  Root Cause: There is "libc++" static linked into the shared library,
and since gdb insert internal breakpoints on std::terminate/longjump/...
so after dlclose, the memory address is
invalid,remove_breakpoints/insert_breakpoints
failed with EIO error.

  Fix: Disable the internal breakpoints when dlclose hit.

2 ChangeLog:

2013-10-16  Tian Ye  <xhengdf@gmail.com>

	PR gdb/16039
	* breakpoint.c (is_removable_in_unloaded_shlib): New.
	(set_longjmp_breakpoint): Check if breakpoint's location
	address is not in an unloaded shared library
	(disable_breakpoints_in_unloaded_shlib): Disable the
	internal breakpoints in the hook function of shared
	library unload.

3 Patch Diffs:

--- breakpoint.c.bak	2013-10-12 01:15:09.044081000 -0700
+++ breakpoint.c	2013-10-15 18:50:59.842116000 -0700
@@ -1118,6 +1118,17 @@ is_tracepoint (const struct breakpoint *
   return is_tracepoint_type (b->type);
 }

+/* Breakpoints should be disable when shlib unload.  */
+
+static int
+is_removable_in_unloaded_shlib(const struct breakpoint *b)
+{
+  return (b->type == bp_longjmp_master
+	  || b->type == bp_std_terminate_master
+	  || b->type == bp_exception_master
+	  || b->type == bp_exception);
+}
+
 /* A helper function that validates that COMMANDS are valid for a
    breakpoint.  This function will throw an exception if a problem is
    found.  */
@@ -7147,8 +7158,8 @@ set_longjmp_breakpoint (struct thread_in
      clones of those and enable them for the requested thread.  */
   ALL_BREAKPOINTS_SAFE (b, b_tmp)
     if (b->pspace == current_program_space
-	&& (b->type == bp_longjmp_master
-	    || b->type == bp_exception_master))
+	&& ((b->type == bp_longjmp_master
+	    || b->type == bp_exception_master) && !b->loc->shlib_disabled))
       {
 	enum bptype type = b->type == bp_longjmp_master ? bp_longjmp : bp_exception;
 	struct breakpoint *clone;
@@ -7463,7 +7474,8 @@ disable_breakpoints_in_unloaded_shlib (s
 	      || b->type == bp_hardware_breakpoint)
 	     && (loc->loc_type == bp_loc_hardware_breakpoint
 		 || loc->loc_type == bp_loc_software_breakpoint))
-	    || is_tracepoint (b))
+	    || is_tracepoint (b)
+	    || is_removable_in_unloaded_shlib(b))
 	&& solib_contains_address_p (solib, loc->address))
       {
 	loc->shlib_disabled = 1;


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

end of thread, other threads:[~2013-10-28 23:33 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-10-16  2:18 [PATCH] bug fix for gdb 16039 Dave.Tian
2013-10-16  3:31 ` Sergio Durigan Junior
2013-10-16  6:44   ` Dave.Tian
2013-10-17 20:25     ` Tom Tromey
2013-10-19  4:38     ` Sergio Durigan Junior
2013-10-21  4:29       ` Dave.Tian
2013-10-28 23:33         ` Sergio Durigan Junior

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox