From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 494 invoked by alias); 30 Aug 2012 14:44:31 -0000 Received: (qmail 483 invoked by uid 22791); 30 Aug 2012 14:44:29 -0000 X-SWARE-Spam-Status: No, hits=-4.0 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,TW_RG X-Spam-Check-By: sourceware.org Received: from imr4.ericy.com (HELO imr4.ericy.com) (198.24.6.9) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 30 Aug 2012 14:44:14 +0000 Received: from eusaamw0711.eamcs.ericsson.se ([147.117.20.178]) by imr4.ericy.com (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id q7UEk5ib006324; Thu, 30 Aug 2012 09:46:24 -0500 Received: from EUSAACMS0703.eamcs.ericsson.se ([169.254.2.164]) by eusaamw0711.eamcs.ericsson.se ([147.117.20.178]) with mapi; Thu, 30 Aug 2012 10:43:56 -0400 From: Marc Khouzam To: "'Mircea Gherzan'" , "'gdb-patches@sourceware.org'" CC: "'mgherzan@gmail.com'" Date: Thu, 30 Aug 2012 14:44:00 -0000 Subject: RE: [PATCH] Add the -catch-load and -catch-unload MI commands. Message-ID: References: <1346320317-1599-1-git-send-email-mircea.gherzan@intel.com> In-Reply-To: <1346320317-1599-1-git-send-email-mircea.gherzan@intel.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-IsSubscribed: yes 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 X-SW-Source: 2012-08/txt/msg00866.txt.bz2 > -----Original Message----- > From: gdb-patches-owner@sourceware.org=20 > [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. >=20 > They are equivalent to "catch load" and "catch unload" from CLI. >=20 > 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=20 "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 b= asis of the terms set out at www.ericsson.com/email_disclaimer=20 >=20 > Signed-off-by: Mircea Gherzan > --- > gdb/ChangeLog | 16 +++++++++ > gdb/Makefile.in | 9 ++++- > gdb/breakpoint.c | 33 +++++++++++++----- > gdb/breakpoint.h | 3 ++ > gdb/mi/mi-cmd-catch.c | 89=20 > +++++++++++++++++++++++++++++++++++++++++++++++++ > 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 >=20 > 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 > + > + * 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=20 > + -catch-unload. > + > 2012-08-29 Doug Evans >=20=20 > * 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=3D > # > SUBDIR_MI_OBS =3D \ > mi-out.o mi-console.o \ > - mi-cmds.o mi-cmd-env.o mi-cmd-var.o mi-cmd-break.o=20 > 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 =3D \ > 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) >=20=20 > +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=20 > breakpoint *b, struct ui_file *fp) >=20=20 > static struct breakpoint_ops catch_solib_breakpoint_ops; >=20=20 > -/* 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. */ >=20=20 > -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 =3D get_current_arch (); > - int tempflag; > struct cleanup *cleanup; >=20=20 > - tempflag =3D get_cmd_context (command) =3D=3D CATCH_TEMPORARY; > - > if (!arg) > arg =3D ""; > arg =3D skip_spaces (arg); > @@ -7860,11 +7856,28 @@ catch_load_or_unload (char *arg, int=20 > from_tty, int is_load, > } >=20=20 > c->is_load =3D is_load; > - init_catchpoint (&c->base, gdbarch, tempflag, NULL, > + init_catchpoint (&c->base, arch, is_temp, NULL, > &catch_solib_breakpoint_ops); >=20=20 > 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 =3D get_cmd_context (command) =3D=3D CATCH_TEMPORARY; > + > + add_solib_catchpoint (get_current_arch (), arg, is_load, > + tempflag); > } >=20=20 > 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=20 > disable_breakpoints_in_shlibs (void); > /* This function returns TRUE if ep is a catchpoint. */ > extern int is_catchpoint (struct breakpoint *); >=20=20 > +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 =3D=3D 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=20 > and/or modify > + it under the terms of the GNU General Public License as=20 > 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=20 > . */ > + > +#include > + > +#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 =3D get_current_arch (); > + char *actual_cmd =3D load ? "-catch-load" : "-catch-unload"; > + int temp =3D 0; > + int oind =3D 0; > + char *oarg; > + enum opt > + { > + TEMP, > + }; > + static const struct mi_opt opts[] =3D > + { > + { "t", TEMP, 0 }, > + }; > + > + for (;;) > + { > + int opt =3D mi_getopt (actual_cmd, argc, argv, opts, > + &oind, &oarg); > + > + if (opt < 0) > + break; > + > + switch ((enum opt) opt) > + { > + case TEMP: > + temp =3D 1; > + break; > + } > + } > + > + if (oind >=3D argc) > + error (_("-catch-load/unload: Missing ")); > + if (oind < argc -1) > + error (_("-catch-load/unload: Garbage following the=20 > ")); > + > + 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[] =3D > { "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 },=20 > 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; > --=20 > 1.7.1 >=20 >=20