This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RE: [PATCH] Add the -catch-load and -catch-unload MI commands.


> -----Original Message-----
> From: gdb-patches-owner@sourceware.org 
> [mailto:gdb-patches-owner@sourceware.org] On Behalf Of Mircea Gherzan
> Sent: Thursday, August 30, 2012 5:52 AM
> To: gdb-patches@sourceware.org
> Cc: mgherzan@gmail.com; Mircea Gherzan
> Subject: [PATCH] Add the -catch-load and -catch-unload MI commands.
> 
> They are equivalent to "catch load" and "catch unload" from CLI.
> 
> Rationale: GUIs might be interested in catching solib load or
> unload events.

I think this can be done with:
 -gdb-set stop-on-solib-events 1

although I don't believe there is support for regex as
"catch load [regex]".

That being said, it may be better to have an MI command to perform the 
"catch" command intead of specifically "catch load".
For example, in Eclipse, we use "catch catch", "catch throw",
"catch exec", "catch fork", "catch vfork", "catch syscall".

Just a thought

Marc


--
This Communication is Confidential. We only send and receive email on the basis of the terms set out at www.ericsson.com/email_disclaimer 

> 
> Signed-off-by: Mircea Gherzan <mircea.gherzan@intel.com>
> ---
>  gdb/ChangeLog         |   16 +++++++++
>  gdb/Makefile.in       |    9 ++++-
>  gdb/breakpoint.c      |   33 +++++++++++++-----
>  gdb/breakpoint.h      |    3 ++
>  gdb/mi/mi-cmd-catch.c |   89 
> +++++++++++++++++++++++++++++++++++++++++++++++++
>  gdb/mi/mi-cmds.c      |    2 +
>  gdb/mi/mi-cmds.h      |    2 +
>  7 files changed, 142 insertions(+), 12 deletions(-)
>  create mode 100644 gdb/mi/mi-cmd-catch.c
> 
> diff --git a/gdb/ChangeLog b/gdb/ChangeLog
> index 6237dee..af373a0 100644
> --- a/gdb/ChangeLog
> +++ b/gdb/ChangeLog
> @@ -1,3 +1,19 @@
> +2012-08-30  Mircea Gherzan  <mircea.gherzan@intel.com>
> +
> +	* Makefile.in (SUBDIR_MI_OBS): Add mi-cmd-catch.o.
> +	(SUBDIR_MI_SRCS): Add mi/mi-cmd-catch.c.
> +	* breakpoint.c (add_solib_catchpoint): New function based on
> +	that can be used by both CLI and MI, factored out from
> +	catch_load_or_unload.
> +	(catch_load_or_unload): Strip it down and make it use the
> +	new add_solib_catchpoint.
> +	* breakpoint.h (add_solib_catchpoint): Declare it.
> +	* mi/mi-cmd-catch.c: New file.
> +	* mi/mi-cmds.c (mi_cmds): Add the handlers for -catch-load
> +	and -catch-unload.
> +	* mi/mi-cmds.h: Declare the handlers for -catch-load and 
> +	-catch-unload.
> +
>  2012-08-29  Doug Evans  <dje@google.com>
>  
>  	* main.c (print_gdb_help): Remove reference to
> diff --git a/gdb/Makefile.in b/gdb/Makefile.in
> index 5d5574e..4b99125 100644
> --- a/gdb/Makefile.in
> +++ b/gdb/Makefile.in
> @@ -200,13 +200,14 @@ SUBDIR_CLI_CFLAGS=
>  #
>  SUBDIR_MI_OBS = \
>  	mi-out.o mi-console.o \
> -	mi-cmds.o mi-cmd-env.o mi-cmd-var.o mi-cmd-break.o 
> mi-cmd-stack.o \
> +	mi-cmds.o mi-cmd-catch.o mi-cmd-env.o \
> +	mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o \
>  	mi-cmd-file.o mi-cmd-disas.o mi-symbol-cmds.o mi-cmd-target.o \
>  	mi-cmd-info.o mi-interp.o \
>  	mi-main.o mi-parse.o mi-getopt.o
>  SUBDIR_MI_SRCS = \
>  	mi/mi-out.c mi/mi-console.c \
> -	mi/mi-cmds.c mi/mi-cmd-env.c \
> +	mi/mi-cmds.c mi/mi-cmd-catch.c mi/mi-cmd-env.c \
>  	mi/mi-cmd-var.c mi/mi-cmd-break.c mi/mi-cmd-stack.c \
>  	mi/mi-cmd-file.c mi/mi-cmd-disas.c mi/mi-symbol-cmds.c \
>  	mi/mi-cmd-target.c mi/mi-cmd-info.c mi/mi-interp.c \
> @@ -1829,6 +1830,10 @@ mi-cmd-break.o: $(srcdir)/mi/mi-cmd-break.c
>  	$(COMPILE) $(srcdir)/mi/mi-cmd-break.c
>  	$(POSTCOMPILE)
>  
> +mi-cmd-catch.o: $(srcdir)/mi/mi-cmd-catch.c
> +	$(COMPILE) $(srcdir)/mi/mi-cmd-catch.c
> +	$(POSTCOMPILE)
> +
>  mi-cmd-disas.o: $(srcdir)/mi/mi-cmd-disas.c
>  	$(COMPILE) $(srcdir)/mi/mi-cmd-disas.c
>  	$(POSTCOMPILE)
> diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
> index b074ecc..e23c431 100644
> --- a/gdb/breakpoint.c
> +++ b/gdb/breakpoint.c
> @@ -7823,20 +7823,16 @@ print_recreate_catch_solib (struct 
> breakpoint *b, struct ui_file *fp)
>  
>  static struct breakpoint_ops catch_solib_breakpoint_ops;
>  
> -/* A helper function that does all the work for "catch load" and
> -   "catch unload".  */
> +/* Shared helper function (MI and CLI) for creating and installing
> +   a shared object event catchpoint.  */
>  
> -static void
> -catch_load_or_unload (char *arg, int from_tty, int is_load,
> -		      struct cmd_list_element *command)
> +int
> +add_solib_catchpoint (struct gdbarch *arch, char *arg, int is_load,
> +                      int is_temp)
>  {
>    struct solib_catchpoint *c;
> -  struct gdbarch *gdbarch = get_current_arch ();
> -  int tempflag;
>    struct cleanup *cleanup;
>  
> -  tempflag = get_cmd_context (command) == CATCH_TEMPORARY;
> -
>    if (!arg)
>      arg = "";
>    arg = skip_spaces (arg);
> @@ -7860,11 +7856,28 @@ catch_load_or_unload (char *arg, int 
> from_tty, int is_load,
>      }
>  
>    c->is_load = is_load;
> -  init_catchpoint (&c->base, gdbarch, tempflag, NULL,
> +  init_catchpoint (&c->base, arch, is_temp, NULL,
>  		   &catch_solib_breakpoint_ops);
>  
>    discard_cleanups (cleanup);
>    install_breakpoint (0, &c->base, 1);
> +
> +  return 1;
> +}
> +
> +/* A helper function that does all the work for "catch load" and
> +   "catch unload".  */
> +
> +static void
> +catch_load_or_unload (char *arg, int from_tty, int is_load,
> +		      struct cmd_list_element *command)
> +{
> +  int tempflag;
> +
> +  tempflag = get_cmd_context (command) == CATCH_TEMPORARY;
> +
> +  add_solib_catchpoint (get_current_arch (), arg, is_load,
> +                        tempflag);
>  }
>  
>  static void
> diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
> index 4c6171f..b98aeff 100644
> --- a/gdb/breakpoint.h
> +++ b/gdb/breakpoint.h
> @@ -1404,6 +1404,9 @@ extern void 
> disable_breakpoints_in_shlibs (void);
>  /* This function returns TRUE if ep is a catchpoint.  */
>  extern int is_catchpoint (struct breakpoint *);
>  
> +extern int add_solib_catchpoint (struct gdbarch *arch, char *arg,
> +                                 int is_load, int is_temp);
> +
>  /* Enable breakpoints and delete when hit.  Called with ARG == NULL
>     deletes all breakpoints.  */
>  extern void delete_command (char *arg, int from_tty);
> diff --git a/gdb/mi/mi-cmd-catch.c b/gdb/mi/mi-cmd-catch.c
> new file mode 100644
> index 0000000..5c4295d
> --- /dev/null
> +++ b/gdb/mi/mi-cmd-catch.c
> @@ -0,0 +1,89 @@
> +/* MI Command Set - catch commands.
> +   Copyright (C) 2012 Free Software Foundation, Inc.
> +
> +   Contributed by Intel Corporation.
> +
> +   This file is part of GDB.
> +
> +   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/>.  */
> +
> +#include <stdio.h>
> +
> +#include "defs.h"
> +#include "arch-utils.h"
> +#include "breakpoint.h"
> +#include "libiberty.h"
> +#include "mi-cmds.h"
> +#include "mi-getopt.h"
> +
> +/* Common path for the -catch-load and -catch-unload.  */
> +
> +static void
> +mi_catch_load_unload (int load, char *argv[], int argc)
> +{
> +  struct gdbarch *arch = get_current_arch ();
> +  char *actual_cmd = load ? "-catch-load" : "-catch-unload";
> +  int temp = 0;
> +  int oind = 0;
> +  char *oarg;
> +  enum opt
> +    {
> +      TEMP,
> +    };
> +  static const struct mi_opt opts[] =
> +    {
> +      { "t", TEMP, 0 },
> +    };
> +
> +  for (;;)
> +    {
> +      int opt = mi_getopt (actual_cmd, argc, argv, opts,
> +                           &oind, &oarg);
> +
> +      if (opt < 0)
> +        break;
> +
> +      switch ((enum opt) opt)
> +        {
> +        case TEMP:
> +          temp = 1;
> +          break;
> +        }
> +    }
> +
> +  if (oind >= argc)
> +    error (_("-catch-load/unload: Missing <library name>"));
> +  if (oind < argc -1)
> +    error (_("-catch-load/unload: Garbage following the 
> <library name>"));
> +
> +  add_solib_catchpoint (arch, argv[oind], load, temp);
> +}
> +
> +/* Handler for the -catch-load.  */
> +
> +void
> +mi_cmd_catch_load (char *cmd, char *argv[], int argc)
> +{
> +  mi_catch_load_unload (1, argv, argc);
> +}
> +
> +
> +/* Handler for the -catch-unload.  */
> +
> +void
> +mi_cmd_catch_unload (char *cmd, char *argv[], int argc)
> +{
> +  mi_catch_load_unload (0, argv, argc);
> +}
> +
> diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c
> index 79fbba1..69e7198 100644
> --- a/gdb/mi/mi-cmds.c
> +++ b/gdb/mi/mi-cmds.c
> @@ -45,6 +45,8 @@ struct mi_cmd mi_cmds[] =
>    { "break-list", { "info break", }, NULL },
>    { "break-passcount", { NULL, 0 }, mi_cmd_break_passcount},
>    { "break-watch", { NULL, 0 }, mi_cmd_break_watch},
> +  { "catch-load", { NULL, 0 }, mi_cmd_catch_load},
> +  { "catch-unload", { NULL, 0 }, mi_cmd_catch_unload},
>    { "data-disassemble", { NULL, 0 }, mi_cmd_disassemble},
>    { "data-evaluate-expression", { NULL, 0 }, 
> mi_cmd_data_evaluate_expression},
>    { "data-list-changed-registers", { NULL, 0 },
> diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h
> index 4d0fc9d..0064240 100644
> --- a/gdb/mi/mi-cmds.h
> +++ b/gdb/mi/mi-cmds.h
> @@ -43,6 +43,8 @@ extern mi_cmd_argv_ftype mi_cmd_break_insert;
>  extern mi_cmd_argv_ftype mi_cmd_break_commands;
>  extern mi_cmd_argv_ftype mi_cmd_break_passcount;
>  extern mi_cmd_argv_ftype mi_cmd_break_watch;
> +extern mi_cmd_argv_ftype mi_cmd_catch_load;
> +extern mi_cmd_argv_ftype mi_cmd_catch_unload;
>  extern mi_cmd_argv_ftype mi_cmd_disassemble;
>  extern mi_cmd_argv_ftype mi_cmd_data_evaluate_expression;
>  extern mi_cmd_argv_ftype mi_cmd_data_list_register_names;
> -- 
> 1.7.1
> 
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]