enum mi_cmd_result mi_cmd_break_insert (char *command, char **argv, int argc) { char *address = NULL; enum bp_type type = REG_BP; int temp_p = 0; int thread = -1; int ignore_count = 0; char *condition = NULL; enum gdb_rc rc; struct gdb_events *old_hooks; enum opt { HARDWARE_OPT, TEMP_OPT /*, REGEXP_OPT */ , CONDITION_OPT, IGNORE_COUNT_OPT, THREAD_OPT }; static struct mi_opt opts[] = { {"h", HARDWARE_OPT, 0}, {"t", TEMP_OPT, 0}, {"c", CONDITION_OPT, 1}, {"i", IGNORE_COUNT_OPT, 1}, {"p", THREAD_OPT, 1}, 0 }; /* Parse arguments. It could be -r or -h or -t, <location> or ``--'' to denote the end of the option list. */ int optind = 0; char *optarg; while (1) { int opt = mi_getopt ("mi_cmd_break_insert", argc, argv, opts, &optind, &optarg); if (opt < 0) break; switch ((enum opt) opt) { case TEMP_OPT: temp_p = 1; break; case HARDWARE_OPT: type = HW_BP; break; #if 0 case REGEXP_OPT: type = REGEXP_BP; break; #endif case CONDITION_OPT: condition = optarg; break; case IGNORE_COUNT_OPT: ignore_count = atol (optarg); break; case THREAD_OPT: thread = atol (optarg); break; } } if (optind >= argc) error ("mi_cmd_break_insert: Missing <location>"); if (optind < argc - 1) error ("mi_cmd_break_insert: Garbage following <location>"); address = argv[optind]; /* Now we have what we need, let's insert the breakpoint! */ old_hooks = set_gdb_event_hooks (&breakpoint_hooks); switch (type) { case REG_BP: rc = gdb_breakpoint (address, condition, 0 /*hardwareflag */ , temp_p, thread, ignore_count); break; case HW_BP: rc = gdb_breakpoint (address, condition, 1 /*hardwareflag */ , temp_p, thread, ignore_count); break; #if 0 case REGEXP_BP: if (temp_p) error ("mi_cmd_break_insert: Unsupported tempoary regexp breakpoint"); else rbreak_command_wrapper (address, FROM_TTY); return MI_CMD_DONE; break; #endif default: internal_error (__FILE__, __LINE__, "mi_cmd_break_insert: Bad switch."); } set_gdb_event_hooks (old_hooks); if (rc == GDB_RC_FAIL) return MI_CMD_CAUGHT_ERROR; else return MI_CMD_DONE; }
enum mi_cmd_result mi_cmd_break_insert (char *command, char **argv, int argc) { char *address = NULL; enum bp_type type = REG_BP; int temp_p = 0; int thread = -1; int ignore_count = 0; char *condition = NULL; int pending = 0; struct gdb_exception e; struct gdb_events *old_hooks; enum opt { HARDWARE_OPT, TEMP_OPT /*, REGEXP_OPT */ , CONDITION_OPT, IGNORE_COUNT_OPT, THREAD_OPT, PENDING_OPT }; static struct mi_opt opts[] = { {"h", HARDWARE_OPT, 0}, {"t", TEMP_OPT, 0}, {"c", CONDITION_OPT, 1}, {"i", IGNORE_COUNT_OPT, 1}, {"p", THREAD_OPT, 1}, {"f", PENDING_OPT, 0}, { 0, 0, 0 } }; /* Parse arguments. It could be -r or -h or -t, <location> or ``--'' to denote the end of the option list. */ int optind = 0; char *optarg; while (1) { int opt = mi_getopt ("mi_cmd_break_insert", argc, argv, opts, &optind, &optarg); if (opt < 0) break; switch ((enum opt) opt) { case TEMP_OPT: temp_p = 1; break; case HARDWARE_OPT: type = HW_BP; break; #if 0 case REGEXP_OPT: type = REGEXP_BP; break; #endif case CONDITION_OPT: condition = optarg; break; case IGNORE_COUNT_OPT: ignore_count = atol (optarg); break; case THREAD_OPT: thread = atol (optarg); break; case PENDING_OPT: pending = 1; break; } } if (optind >= argc) error (_("mi_cmd_break_insert: Missing <location>")); if (optind < argc - 1) error (_("mi_cmd_break_insert: Garbage following <location>")); address = argv[optind]; /* Now we have what we need, let's insert the breakpoint! */ old_hooks = deprecated_set_gdb_event_hooks (&breakpoint_hooks); /* Make sure we restore hooks even if exception is thrown. */ TRY_CATCH (e, RETURN_MASK_ALL) { switch (type) { case REG_BP: set_breakpoint (address, condition, 0 /*hardwareflag */ , temp_p, thread, ignore_count, pending); break; case HW_BP: set_breakpoint (address, condition, 1 /*hardwareflag */ , temp_p, thread, ignore_count, pending); break; #if 0 case REGEXP_BP: if (temp_p) error (_("mi_cmd_break_insert: Unsupported tempoary regexp breakpoint")); else rbreak_command_wrapper (address, FROM_TTY); return MI_CMD_DONE; break; #endif default: internal_error (__FILE__, __LINE__, _("mi_cmd_break_insert: Bad switch.")); } } deprecated_set_gdb_event_hooks (old_hooks); if (e.reason < 0) throw_exception (e); return MI_CMD_DONE; }
enum mix_cmd_result mix_cmd_break_insert (char *command, char **argv, int argc) { char *address = NULL; enum bp_type type = REG_BP; int temp_p = 0; int thread = -1; int ignore_count = 0; char *condition = NULL; char *requested_shlib = NULL; char realpath_buf[PATH_MAX]; enum gdb_rc rc; int *indices = NULL; int pending = 0; struct gdb_exception e; struct gdb_events *old_hooks; enum opt { HARDWARE_OPT, TEMP_OPT /*, REGEXP_OPT */ , CONDITION_OPT, IGNORE_COUNT_OPT, THREAD_OPT, PENDING_OPT, SHLIB_OPT, LIST_OPT }; static struct mix_opt opts[] = { {"h", HARDWARE_OPT, 0}, {"t", TEMP_OPT, 0}, {"c", CONDITION_OPT, 1}, {"i", IGNORE_COUNT_OPT, 1}, {"p", THREAD_OPT, 1}, {"f", PENDING_OPT, 0}, {"s", SHLIB_OPT, 1}, {"l", LIST_OPT, 1}, { 0, 0, 0 } }; /* Parse arguments. It could be -r or -h or -t, <location> or ``--'' to denote the end of the option list. */ int optind = 0; char *optarg; struct cleanup *indices_cleanup = NULL; while (1) { int opt = mix_getopt ("mix_cmd_break_insert", argc, argv, opts, &optind, &optarg); if (opt < 0) break; switch ((enum opt) opt) { case TEMP_OPT: temp_p = 1; break; case HARDWARE_OPT: type = HW_BP; break; #if 0 case REGEXP_OPT: type = REGEXP_BP; break; #endif case CONDITION_OPT: condition = optarg; break; case IGNORE_COUNT_OPT: ignore_count = atol (optarg); /* APPLE LOCAL: Same behavior as set_ignore_count(). */ if (ignore_count < 0) ignore_count = 0; break; case THREAD_OPT: thread = atol (optarg); break; case PENDING_OPT: pending = 1; break; case SHLIB_OPT: requested_shlib = optarg; break; case LIST_OPT: { char *numptr; int nelem = 0, i; /* First count the number of elements, which is the number of spaces plus one. */ numptr = optarg; while (*numptr) { if (*numptr != ' ') { nelem++; while (*numptr != ' ' && *numptr != '\0') numptr++; } else numptr++; } if (nelem == 0) error ("mix_cmd_break_insert: Got index with no elements"); indices = (int *) xmalloc ((nelem + 1) * sizeof (int *)); indices_cleanup = make_cleanup (xfree, indices); /* Now extract the elements. */ numptr = optarg; i = 0; errno = 0; while (*numptr != '\0') { indices[i++] = strtol (numptr, &numptr, 10); if (errno == EINVAL) error ("mix_cmd_break_insert: bad index at \"%s\"", numptr); } /* Since we aren't passing a number of elements, we terminate the indices by putting in a -1 element. */ indices[i] = -1; break; } } } if (optind >= argc) error (_("mix_cmd_break_insert: Missing <location>")); if (optind < argc - 1) error (_("mix_cmd_break_insert: Garbage following <location>")); address = argv[optind]; /* APPLE LOCAL: realpath() the incoming shlib name, as we do with all objfile/dylib/executable names. NB this condition is incorrect if we're passed something like "./foo.dylib", "../foo.dylib", or "~/bin/foo.dylib", but that shouldn't happen.... */ if (requested_shlib && IS_ABSOLUTE_PATH (requested_shlib)) { realpath (requested_shlib, realpath_buf); /* It'll be xstrdup()'ed down in the breakpoint command, so just point to the stack array until then. */ requested_shlib = realpath_buf; } /* Now we have what we need, let's insert the breakpoint! */ if (! mi_breakpoint_observers_installed) { observer_attach_breakpoint_created (breakpoint_notify); observer_attach_breakpoint_modified (breakpoint_notify); observer_attach_breakpoint_deleted (breakpoint_notify); mi_breakpoint_observers_installed = 1; } mi_can_breakpoint_notify = 1; /* Make sure we restore hooks even if exception is thrown. */ TRY_CATCH (e, RETURN_MASK_ALL) { switch (type) { case REG_BP: set_breakpoint (address, condition, 0 /*hardwareflag */, temp_p, thread, ignore_count, pending); break; case HW_BP: set_breakpoint (address, condition, 1 /*hardwareflag */, temp_p, thread, ignore_count, pending); break; #if 0 case REGEXP_BP: if (temp_p) error (_("mix_cmd_break_insert: Unsupported tempoary regexp breakpoint")); else rbreak_command_wrapper (address, FROM_TTY); return MIX_CMD_DONE; break; #endif default: internal_error (__FILE__, __LINE__, _("mix_cmd_break_insert: Bad switch.")); } } mi_can_breakpoint_notify = 0; if (e.reason < 0) throw_exception (e); return MIX_CMD_DONE; }