diff options
author | Mircea Gherzan <mgherzan@sourceware.org> | 2012-12-12 21:20:13 +0000 |
---|---|---|
committer | Mircea Gherzan <mgherzan@sourceware.org> | 2012-12-12 21:20:13 +0000 |
commit | 91985142973d550628c61d201e0a7cd3e36cd5b3 (patch) | |
tree | 2ad6df5064c30b67befdfbd0951935a7a96c95ff /gdb/breakpoint.c | |
parent | afedb563c68c0856f41d8b8de5822943e136702a (diff) | |
download | gdb-91985142973d550628c61d201e0a7cd3e36cd5b3.zip gdb-91985142973d550628c61d201e0a7cd3e36cd5b3.tar.gz gdb-91985142973d550628c61d201e0a7cd3e36cd5b3.tar.bz2 |
MI: add the -catch-load and -catch-unload commands
They are equivalent to "catch load" and "catch unload" from CLI.
Rationale: GUIs might be interested in catching solib load or
unload events.
2012-11-16 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 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-break.h: New file.
* mi/mi-cmd-break.c: Include mi-cmd-break.h.
(setup_breakpoint_reporting): New function used for both
catchpoints and breakpoints.
(mi_cmd_break_insert): Use setup_breakpoint_reporting.
* 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.
Diffstat (limited to 'gdb/breakpoint.c')
-rw-r--r-- | gdb/breakpoint.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 01a472c..2fe8f14 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -7850,20 +7850,20 @@ 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. If IS_LOAD is non-zero then + the events to be caught are load events, otherwise they are + unload events. If IS_TEMP is non-zero the catchpoint is a + temporary one. If ENABLED is non-zero the catchpoint is + created in an enabled state. */ -static void -catch_load_or_unload (char *arg, int from_tty, int is_load, - struct cmd_list_element *command) +void +add_solib_catchpoint (char *arg, int is_load, int is_temp, int enabled) { 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); @@ -7887,13 +7887,30 @@ 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, gdbarch, is_temp, NULL, &catch_solib_breakpoint_ops); + c->base.enable_state = enabled ? bp_enabled : bp_disabled; + discard_cleanups (cleanup); install_breakpoint (0, &c->base, 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; + const int enabled = 1; + + tempflag = get_cmd_context (command) == CATCH_TEMPORARY; + + add_solib_catchpoint (arg, is_load, tempflag, enabled); +} + static void catch_load_command_1 (char *arg, int from_tty, struct cmd_list_element *command) |