[PATCH:MI] Use observers for breakpoints

Vladimir Prus ghost@cs.msu.su
Wed Jun 4 07:31:00 GMT 2008


On Sunday 01 June 2008 06:46:04 Nick Roberts wrote:

> (gdb)
> -break-watch i22
> =breakpoints-changed,bkpt={number="4",type="watchpoint",disp="keep",e
>nabled="y",addr="",what="i22",times="0",original-location="i22"}
> ^done,wpt={number="4",exp="i22"}

Is this an output we actually want? ;-)
With one breakpoint mentioned twice?

> 2008-06-01  Nick Roberts  <nickrob@snap.net.nz>
> 
>         * mi/mi-interp.c (mi_breakpoints_changed): New function.
>         (mi_interpreter_init): Register mi_breakpoints_changed as
>         breakpoints_changed observer.
> 
>         * mi/mi-cmd-break.c (breakpoint_notify, breakpoint_hooks): Delete.
>         (mi_cmd_break_insert): Don't use deprecated_set_gdb_event_hooks.
> 
>         * breakpoint.c (condition_command, commands_command)
>         (commands_from_control_command, mention, delete_breakpoint)
>         (set_ignore_count, disable_breakpoint, do_enable_breakpoint): 
>         Call observer_notify_breakpoints_changed.

I wonder if you missed this bit in bpstat_stop_status:

	if (b->disposition == disp_disable)
	  {
	    b->enable_state = bp_disabled;
	    update_global_location_list ();
	  }

Probably, breakpoint_re_set_one should call the observer too.

In fact, it's probably would be nice to add call to the observer to
update_global_location_list. This function is called whenever we change any property 
of a  breakpoint that affects what should be inserted in the target. The only
issue is that right now update_global_location_list does not know which breakpoint
has changed -- we probably can add a parameter.

This won't catch all cases -- there are properties of breakpoints that are not 
reflected in the target -- like condition, commands and ignore count. But seems like
your patch has it covered already.

Is there any way to make -break-insert report the new breakpoint directly, as opposed to
via notification?


> Index: mi/mi-cmd-break.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/mi/mi-cmd-break.c,v
> retrieving revision 1.19
> diff -p -u -r1.19 mi-cmd-break.c
> --- mi/mi-cmd-break.c   1 Feb 2008 16:24:46 -0000       1.19
> +++ mi/mi-cmd-break.c   1 Jun 2008 02:17:21 -0000
> @@ -24,7 +24,6 @@
>  #include "breakpoint.h"
>  #include "gdb_string.h"
>  #include "mi-getopt.h"
> -#include "gdb-events.h"
>  #include "gdb.h"
>  #include "exceptions.h"
>  
> @@ -33,23 +32,6 @@ enum
>      FROM_TTY = 0
>    };
>  
> -/* Output a single breakpoint. */
> -
> -static void
> -breakpoint_notify (int b)
> -{
> -  gdb_breakpoint_query (uiout, b, NULL);
> -}
> -
> -
> -struct gdb_events breakpoint_hooks =
> -{
> -  breakpoint_notify,
> -  breakpoint_notify,
> -  breakpoint_notify,
> -};
> -
> -
>  enum bp_type
>    {
>      REG_BP,
> @@ -71,7 +53,6 @@ mi_cmd_break_insert (char *command, char
>    char *condition = NULL;
>    int pending = 0;
>    struct gdb_exception e;
> -  struct gdb_events *old_hooks;
>    enum opt
>      {
>        HARDWARE_OPT, TEMP_OPT /*, REGEXP_OPT */ , CONDITION_OPT,
> @@ -131,8 +112,6 @@ mi_cmd_break_insert (char *command, char
>      error (_("mi_cmd_break_insert: Garbage following <location>"));
>    address = argv[optind];
>  
> -  /* Now we have what we need, let's insert the breakpoint! */
> -  old_hooks = deprecated_set_gdb_event_hooks (&breakpoint_hooks);
>    /* Make sure we restore hooks even if exception is thrown.  */
>    TRY_CATCH (e, RETURN_MASK_ALL)
>      {
> @@ -164,7 +143,7 @@ mi_cmd_break_insert (char *command, char
>                           _("mi_cmd_break_insert: Bad switch."));
>         }
>      }
> -  deprecated_set_gdb_event_hooks (old_hooks);
> +
>    if (e.reason < 0)
>      throw_exception (e);
>  
> Index: mi/mi-interp.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/mi/mi-interp.c,v
> retrieving revision 1.30
> diff -p -u -r1.30 mi-interp.c
> --- mi/mi-interp.c      3 May 2008 15:10:42 -0000       1.30
> +++ mi/mi-interp.c      1 Jun 2008 02:17:22 -0000
> @@ -68,6 +68,7 @@ static void mi_remove_notify_hooks (void
>  
>  static void mi_new_thread (struct thread_info *t);
>  static void mi_thread_exit (struct thread_info *t);
> +static void mi_breakpoints_changed (int bnum);
>  
>  static void *
>  mi_interpreter_init (int top_level)
> @@ -92,6 +93,7 @@ mi_interpreter_init (int top_level)
>      {
>        observer_attach_new_thread (mi_new_thread);
>        observer_attach_thread_exit (mi_thread_exit);
> +      observer_attach_breakpoints_changed (mi_breakpoints_changed);
>      }
>  
>    return mi;
> @@ -331,6 +333,27 @@ mi_thread_exit (struct thread_info *t)
>    gdb_flush (mi->event_channel);
>  }
>  
> +static void
> +mi_breakpoints_changed (int bnum)
> +{
> +  struct mi_interp *mi = top_level_interpreter_data ();
> +  struct interp *interp_to_use;
> +  struct ui_out *old_uiout, *temp_uiout;
> +  int version;
> +
> +  fprintf_unfiltered (mi->event_channel, "breakpoints-changed");
> +  interp_to_use = top_level_interpreter ();
> +  old_uiout = uiout;
> +  temp_uiout = interp_ui_out (interp_to_use);
> +  version = mi_version (temp_uiout);
> +  temp_uiout = mi_out_new (version);
> +  uiout = temp_uiout;
> +  breakpoint_query (bnum);

Shall we have a helper function to do this creation of temporary uiout?

I think that except for compatibility issues due to -break-insert no longer
reporting the breakpoint that is created as part of ^done response, this
patch is good.

- Volodya



More information about the Gdb-patches mailing list