if (extra_string != NULL && *extra_string == '\0')
extra_string = NULL;
+ /* A bp_dprintf must always have an accompanying EXTRA_STRING containing
+ the dprintf format and arguments -- PARSE_EXTRA should always be false
+ in this case.
+
+ For all other breakpoint types, EXTRA_STRING should be nullptr unless
+ PARSE_EXTRA is true. */
+ gdb_assert ((type_wanted == bp_dprintf)
+ ? (extra_string != nullptr && !parse_extra)
+ : (extra_string == nullptr || parse_extra));
+
try
{
ops->create_sals_from_location_spec (locspec, &canonical);
if (parse_extra)
{
+ gdb_assert (type_wanted != bp_dprintf);
+
gdb::unique_xmalloc_ptr<char> rest;
gdb::unique_xmalloc_ptr<char> cond;
find_condition_and_thread_for_sals (lsal.sals, extra_string,
&cond, &thread, &inferior,
&task, &rest);
+
+ if (rest.get () != nullptr && *(rest.get ()) != '\0')
+ error (_("Garbage '%s' at end of command"), rest.get ());
+
cond_string_copy = std::move (cond);
extra_string_copy = std::move (rest);
}
else
{
- if (type_wanted != bp_dprintf
- && extra_string != NULL && *extra_string != '\0')
- error (_("Garbage '%s' at end of location"), extra_string);
-
/* Check the validity of the condition. We should error out
if the condition is invalid at all of the locations and
if it is not forced. In the PARSE_EXTRA case above, this
/* If non-NULL, ARG should have been advanced past the location;
the next character must be ','. */
- if (arg != NULL)
+ if (arg == nullptr || arg[0] != ',' || arg[1] == '\0')
+ error (_("Format string required"));
+ else
{
- if (arg[0] != ',' || arg[1] == '\0')
- error (_("Format string required"));
- else
- {
- /* Skip the comma. */
- ++arg;
- }
+ /* Skip the comma. */
+ ++arg;
}
create_breakpoint (get_current_arch (),
locspec.get (),
NULL, -1, -1,
- arg, false, 1 /* parse arg */,
+ arg, false, 0 /* parse arg */,
0, bp_dprintf,
0 /* Ignore count */,
pending_break_support,
location_spec_up locspec = string_to_location_spec (&addr_str,
current_language);
+
+
+ gdb_assert (addr_str != nullptr);
+ if (*addr_str != '\0')
+ error (_("Garbage '%s' at end of location"), addr_str);
+
if (!create_breakpoint (get_current_arch (),
locspec.get (),
utp->cond_string.get (), -1, -1, addr_str,
functions for setting a breakpoint at LOCSPEC.
This function has two major modes of operations, selected by the
- PARSE_EXTRA parameter.
+ PARSE_EXTRA and WANTED_TYPE parameters.
- If PARSE_EXTRA is zero, LOCSPEC is just the breakpoint's location
- spec, with condition, thread, and extra string specified by the
- COND_STRING, THREAD, and EXTRA_STRING parameters.
+ When WANTED_TYPE is not bp_dprintf the following rules apply:
- If PARSE_EXTRA is non-zero, this function will attempt to extract
- the condition, thread, and extra string from EXTRA_STRING, ignoring
- the similarly named parameters.
+ If PARSE_EXTRA is zero, LOCSPEC is just the breakpoint's location
+ spec, with condition, thread, and extra string specified by the
+ COND_STRING, THREAD, and EXTRA_STRING parameters.
- If FORCE_CONDITION is true, the condition is accepted even when it is
- invalid at all of the locations. However, if PARSE_EXTRA is non-zero,
- the FORCE_CONDITION parameter is ignored and the corresponding argument
- is parsed from EXTRA_STRING.
+ If PARSE_EXTRA is non-zero, this function will attempt to extract the
+ condition, thread, and extra string from EXTRA_STRING, ignoring the
+ similarly named parameters.
+
+ When WANTED_TYPE is bp_dprintf the following rules apply:
+
+ PARSE_EXTRA must always be zero, LOCSPEC is just the breakpoint's
+ location spec, with condition, thread, and extra string (which
+ contains the dprintf format and arguments) specified by the
+ COND_STRING, THREAD, and EXTRA_STRING parameters.
+
+ If FORCE_CONDITION is true, the condition (in COND_STRING) is accepted
+ even when it is invalid at all of the locations. However, if
+ PARSE_EXTRA is non-zero and WANTED_TYPE is not bp_dprintf, the
+ FORCE_CONDITION parameter is ignored and the corresponding argument is
+ parsed from EXTRA_STRING.
The THREAD should be a global thread number, the created breakpoint will
only apply for that thread. If the breakpoint should apply for all
- threads then pass -1. However, if PARSE_EXTRA is non-zero then the
- THREAD parameter is ignored and an optional thread number will be parsed
- from EXTRA_STRING.
+ threads then pass -1. However, if PARSE_EXTRA is non-zero and
+ WANTED_TYPE is not bp_dprintf, then the THREAD parameter is ignored and
+ an optional thread number will be parsed from EXTRA_STRING.
The INFERIOR should be a global inferior number, the created breakpoint
will only apply for that inferior. If the breakpoint should apply for
- all inferiors then pass -1. However, if PARSE_EXTRA is non-zero then
- the INFERIOR parameter is ignored and an optional inferior number will
- be parsed from EXTRA_STRING.
+ all inferiors then pass -1. However, if PARSE_EXTRA is non-zero and
+ WANTED_TYPE is not bp_dprintf, then the INFERIOR parameter is ignored
+ and an optional inferior number will be parsed from EXTRA_STRING.
At most one of THREAD and INFERIOR should be set to a value other than
-1; breakpoints can be thread specific, or inferior specific, but not