From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28376 invoked by alias); 30 Aug 2012 09:52:38 -0000 Received: (qmail 28361 invoked by uid 22791); 30 Aug 2012 09:52:36 -0000 X-SWARE-Spam-Status: No, hits=-6.6 required=5.0 tests=BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,TW_RG X-Spam-Check-By: sourceware.org Received: from mga09.intel.com (HELO mga09.intel.com) (134.134.136.24) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 30 Aug 2012 09:52:22 +0000 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP; 30 Aug 2012 02:52:18 -0700 X-ExtLoop1: 1 Received: from swsutil001.isw.intel.com ([10.237.237.11]) by orsmga002.jf.intel.com with ESMTP; 30 Aug 2012 02:52:06 -0700 Received: from ulslx001.iul.intel.com (ulslx001.iul.intel.com [172.28.207.63]) by swsutil001.isw.intel.com (8.13.6/8.13.6/MailSET/Hub) with ESMTP id q7U9q5Ys006913; Thu, 30 Aug 2012 10:52:05 +0100 Received: from ulslx001.iul.intel.com (localhost [127.0.0.1]) by ulslx001.iul.intel.com with ESMTP id q7U9q57r001634; Thu, 30 Aug 2012 11:52:05 +0200 Received: (from mgherza1@localhost) by ulslx001.iul.intel.com with id q7U9q4io001630; Thu, 30 Aug 2012 11:52:04 +0200 From: Mircea Gherzan To: gdb-patches@sourceware.org Cc: mgherzan@gmail.com, Mircea Gherzan Subject: [PATCH] Add the -catch-load and -catch-unload MI commands. Date: Thu, 30 Aug 2012 09:52:00 -0000 Message-Id: <1346320317-1599-1-git-send-email-mircea.gherzan@intel.com> 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/msg00865.txt.bz2 They are equivalent to "catch load" and "catch unload" from CLI. Rationale: GUIs might be interested in catching solib load or unload events. 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= # 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 . */ + +#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 = 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 ")); + 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[] = { "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