gdb/mi: add a '--force' flag to the '-break-condition' command

Add a '--force' flag to the '-break-condition' command to be
able to force conditions.

gdb/ChangeLog:
2021-05-06  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	* mi/mi-cmd-break.c (mi_cmd_break_condition): New function.
	* mi/mi-cmds.c: Change the binding of "-break-condition" to
	mi_cmd_break_condition.
	* mi/mi-cmds.h (mi_cmd_break_condition): Declare.
	* breakpoint.h (set_breakpoint_condition): Declare a new
	overload.
	* breakpoint.c (set_breakpoint_condition): New overloaded function
	extracted out from ...
	(condition_command): ... this.
	* NEWS: Mention the change.

gdb/testsuite/ChangeLog:
2021-05-06  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	* gdb.mi/mi-break.exp (test_forced_conditions): Add a test
	for the -break-condition command's "--force" flag.

gdb/doc/ChangeLog:
2021-05-06  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	* gdb.texinfo (GDB/MI Breakpoint Commands): Mention the
	'--force' flag of the '-break-condition' command.
This commit is contained in:
Tankut Baris Aktemur 2021-05-06 10:13:06 +02:00
parent 10e578d7e0
commit 79aabb7308
11 changed files with 147 additions and 29 deletions

View file

@ -1,3 +1,16 @@
2021-05-06 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* mi/mi-cmd-break.c (mi_cmd_break_condition): New function.
* mi/mi-cmds.c: Change the binding of "-break-condition" to
mi_cmd_break_condition.
* mi/mi-cmds.h (mi_cmd_break_condition): Declare.
* breakpoint.h (set_breakpoint_condition): Declare a new
overload.
* breakpoint.c (set_breakpoint_condition): New overloaded function
extracted out from ...
(condition_command): ... this.
* NEWS: Mention the change.
2021-05-06 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* mi/mi-cmd-break.c (mi_cmd_break_insert_1): Recognize the

View file

@ -39,6 +39,13 @@
is equivalent to the '-force-condition' flag of the CLI's "break"
command.
** '-break-condition --force'
The MI -break-condition command now supports a '--force' flag to
forcibly define a condition even when the condition is invalid at
all locations of the selected breakpoint. This is equivalent to
the '-force' flag of the CLI's "cond" command.
* GDB now supports core file debugging for x86_64 Cygwin programs.
* GDB will now look for the .gdbinit file in a config directory before

View file

@ -973,6 +973,39 @@ set_breakpoint_condition (struct breakpoint *b, const char *exp,
gdb::observers::breakpoint_modified.notify (b);
}
/* See breakpoint.h. */
void
set_breakpoint_condition (int bpnum, const char *exp, int from_tty,
bool force)
{
struct breakpoint *b;
ALL_BREAKPOINTS (b)
if (b->number == bpnum)
{
/* Check if this breakpoint has a "stop" method implemented in an
extension language. This method and conditions entered into GDB
from the CLI are mutually exclusive. */
const struct extension_language_defn *extlang
= get_breakpoint_cond_ext_lang (b, EXT_LANG_NONE);
if (extlang != NULL)
{
error (_("Only one stop condition allowed. There is currently"
" a %s stop condition defined for this breakpoint."),
ext_lang_capitalized_name (extlang));
}
set_breakpoint_condition (b, exp, from_tty, force);
if (is_breakpoint (b))
update_global_location_list (UGLL_MAY_INSERT);
return;
}
error (_("No breakpoint number %d."), bpnum);
}
/* The options for the "condition" command. */
struct condition_command_opts
@ -1066,7 +1099,6 @@ condition_completer (struct cmd_list_element *cmd,
static void
condition_command (const char *arg, int from_tty)
{
struct breakpoint *b;
const char *p;
int bnum;
@ -1085,30 +1117,7 @@ condition_command (const char *arg, int from_tty)
if (bnum == 0)
error (_("Bad breakpoint argument: '%s'"), arg);
ALL_BREAKPOINTS (b)
if (b->number == bnum)
{
/* Check if this breakpoint has a "stop" method implemented in an
extension language. This method and conditions entered into GDB
from the CLI are mutually exclusive. */
const struct extension_language_defn *extlang
= get_breakpoint_cond_ext_lang (b, EXT_LANG_NONE);
if (extlang != NULL)
{
error (_("Only one stop condition allowed. There is currently"
" a %s stop condition defined for this breakpoint."),
ext_lang_capitalized_name (extlang));
}
set_breakpoint_condition (b, p, from_tty, cc_opts.force_condition);
if (is_breakpoint (b))
update_global_location_list (UGLL_MAY_INSERT);
return;
}
error (_("No breakpoint number %d."), bnum);
set_breakpoint_condition (bnum, p, from_tty, cc_opts.force_condition);
}
/* Check that COMMAND do not contain commands that are suitable

View file

@ -1656,6 +1656,14 @@ extern void breakpoint_retire_moribund (void);
extern void set_breakpoint_condition (struct breakpoint *b, const char *exp,
int from_tty, bool force);
/* Set break condition for the breakpoint with number BPNUM to EXP.
Raise an error if no breakpoint with the given number is found.
Also raise an error if the breakpoint already has stop conditions.
If FORCE, define the condition even if it is invalid in
all of the breakpoint locations. */
extern void set_breakpoint_condition (int bpnum, const char *exp,
int from_tty, bool force);
/* Checks if we are catching syscalls or not.
Returns 0 if not, greater than 0 if we are. */
extern int catch_syscall_enabled (void);

View file

@ -1,3 +1,8 @@
2021-05-06 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* gdb.texinfo (GDB/MI Breakpoint Commands): Mention the
'--force' flag of the '-break-condition' command.
2021-05-06 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* gdb.texinfo (GDB/MI Breakpoint Commands): Mention the

View file

@ -30532,13 +30532,15 @@ times="0"@}
@subsubheading Synopsis
@smallexample
-break-condition @var{number} @var{expr}
-break-condition [ --force ] @var{number} @var{expr}
@end smallexample
Breakpoint @var{number} will stop the program only if the condition in
@var{expr} is true. The condition becomes part of the
@samp{-break-list} output (see the description of the @samp{-break-list}
command below).
command below). If the @samp{--force} flag is passed, the condition
is forcibly defined even when it is invalid for all locations of
breakpoint @var{number}.
@subsubheading @value{GDBN} Command

View file

@ -386,6 +386,63 @@ mi_cmd_dprintf_insert (const char *command, char **argv, int argc)
mi_cmd_break_insert_1 (1, command, argv, argc);
}
/* Implements the -break-condition command.
See the MI manual for the list of options. */
void
mi_cmd_break_condition (const char *command, char **argv, int argc)
{
enum option
{
FORCE_CONDITION_OPT,
};
static const struct mi_opt opts[] =
{
{"-force", FORCE_CONDITION_OPT, 0},
{ 0, 0, 0 }
};
/* Parse arguments. */
int oind = 0;
char *oarg;
bool force_condition = false;
while (true)
{
int opt = mi_getopt ("-break-condition", argc, argv,
opts, &oind, &oarg);
if (opt < 0)
break;
switch (opt)
{
case FORCE_CONDITION_OPT:
force_condition = true;
break;
}
}
/* There must be at least two more args: a bpnum and a condition
expression. */
if (oind + 1 >= argc)
error (_("-break-condition: Missing the <number> and/or <expr> "
"argument"));
int bpnum = atoi (argv[oind]);
/* The rest form the condition expr. */
std::string expr (argv[oind + 1]);
for (int i = oind + 2; i < argc; ++i)
{
expr += " ";
expr += argv[i];
}
set_breakpoint_condition (bpnum, expr.c_str (), 0 /* from_tty */,
force_condition);
}
enum wp_type
{
REG_WP,

View file

@ -45,7 +45,7 @@ static struct mi_cmd mi_cmds[] =
DEF_MI_CMD_MI ("add-inferior", mi_cmd_add_inferior),
DEF_MI_CMD_CLI_1 ("break-after", "ignore", 1,
&mi_suppress_notification.breakpoint),
DEF_MI_CMD_CLI_1 ("break-condition","cond", 1,
DEF_MI_CMD_MI_1 ("break-condition", mi_cmd_break_condition,
&mi_suppress_notification.breakpoint),
DEF_MI_CMD_MI_1 ("break-commands", mi_cmd_break_commands,
&mi_suppress_notification.breakpoint),

View file

@ -36,6 +36,7 @@ extern mi_cmd_argv_ftype mi_cmd_ada_task_info;
extern mi_cmd_argv_ftype mi_cmd_add_inferior;
extern mi_cmd_argv_ftype mi_cmd_break_insert;
extern mi_cmd_argv_ftype mi_cmd_dprintf_insert;
extern mi_cmd_argv_ftype mi_cmd_break_condition;
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;

View file

@ -1,3 +1,8 @@
2021-05-06 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* gdb.mi/mi-break.exp (test_forced_conditions): Add a test
for the -break-condition command's "--force" flag.
2021-05-06 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* gdb.mi/mi-break.exp (test_forced_conditions): New proc that

View file

@ -424,6 +424,17 @@ proc_with_prefix test_forced_conditions {} {
mi_gdb_test "-dprintf-insert -c bad --force-condition callme \"Hello\"" \
"${warning}\\^done,$bp" \
"dprintf with forced condition"
# Define a plain breakpoint first, and a condition later.
mi_create_breakpoint "callme" "define a bp" ""
mi_gdb_test "-break-condition --force 16 bad == 42" \
"${warning}\\^done" \
"invalid condition is forced"
set args [list -cond "bad == 42" -locations "\\\[$loc\\\]"]
set bp [eval mi_make_breakpoint_multi $args]
mi_gdb_test "-break-info 16" \
"\\^done,[mi_make_breakpoint_table [list $bp]]" \
"invalid condition is defined"
}
proc test_break {mi_mode} {