From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7092 invoked by alias); 30 Aug 2012 17:52:42 -0000 Received: (qmail 7081 invoked by uid 22791); 30 Aug 2012 17:52:40 -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 17:52:25 +0000 Received: from eusaamw0707.eamcs.ericsson.se ([147.117.20.32]) by imr4.ericy.com (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id q7UHsYcm024661; Thu, 30 Aug 2012 12:54:35 -0500 Received: from EUSAACMS0703.eamcs.ericsson.se ([169.254.2.164]) by eusaamw0707.eamcs.ericsson.se ([147.117.20.32]) with mapi; Thu, 30 Aug 2012 13:52:16 -0400 From: Marc Khouzam To: "'Mircea Gherzan'" CC: "'gdb-patches@sourceware.org'" , "'mgherzan@gmail.com'" Date: Thu, 30 Aug 2012 17:52: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> <503FA714.4020206@intel.com> In-Reply-To: <503FA714.4020206@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/msg00871.txt.bz2 > -----Original Message----- > From: Mircea Gherzan [mailto:mircea.gherzan@intel.com]=20 > Sent: Thursday, August 30, 2012 1:47 PM > To: Marc Khouzam > Cc: 'gdb-patches@sourceware.org'; 'mgherzan@gmail.com' > Subject: Re: [PATCH] Add the -catch-load and -catch-unload MI=20 > commands. >=20 > On 30.08.2012 16:43, Marc Khouzam wrote: > > > >> -----Original Message----- > >> From: gdb-patches-owner@sourceware.org > >> [mailto:gdb-patches-owner@sourceware.org] On Behalf Of=20 > 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]". >=20 > It's precisely this kind of support that I'm aiming at. >=20 > > That being said, it may be better to have an MI command to=20 > 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". >=20 > Please, can you propose a format for such a command family? I=20 > see it like: >=20 > -catch --load [params] > -catch --unload [params] The GDB experts would know better, but I'm thinking of something like: -break-catch [regexp] Marc >=20 > Thanks, > Mircea >=20 > > Just a thought > > > > Marc > > > > > > -- > > This Communication is Confidential. We only send and=20 > receive email on the basis of the terms set out at=20 > www.ericsson.com/email_disclaimer > > > >> > >> 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 > >> +++++++++++++++++++++++++++++++++++++++++++++++++ > >> 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 > >> + > >> + * 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 > >> > >> * 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 > >> 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) > >> > >> +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,=20 > int is_load, > >> + int is_temp) > >> { > >> struct solib_catchpoint *c; > >> - struct gdbarch *gdbarch =3D get_current_arch (); > >> - int tempflag; > >> struct cleanup *cleanup; > >> > >> - 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 > >> from_tty, int is_load, > >> } > >> > >> 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); > >> > >> 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); > >> } > >> > >> 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=20 > 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 > >> 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=20 > 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=20 > Public License > >> + along with this program. If not, see > >> . */ > >> + > >> +#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 > >> ")); > >> + > >> + 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 }, > >> 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 > >> >=20 >=20 > --=20 >=20 >=20 > Intel GmbH > Dornacher Strasse 1 > 85622 Feldkirchen/Muenchen, Deutschland > Sitz der Gesellschaft: Feldkirchen bei Muenchen > Geschaeftsfuehrer: Peter Gleissner, Christian Lamprechter,=20 > Hannes Schwaderer, Douglas Lusk > Registergericht: Muenchen HRB 47456 > Ust.-IdNr./VAT Registration No.: DE129385895 > Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052 >=20 >=20