mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 09:08:59 +00:00
gdb/mi: handle no condition argument case for -break-condition
As reported in PR gdb/28076 [1], passing no condition argument to the -break-condition command (e.g.: "-break-condition 2") should clear the condition for breakpoint 2, just like CLI's "condition 2", but instead an error message is returned: ^error,msg="-break-condition: Missing the <number> and/or <expr> argument" The current implementation of the -break-condition command's argument handling (79aabb7308"gdb/mi: add a '--force' flag to the '-break-condition' command") was done according to the documentation, where the condition argument seemed mandatory. However, the -break-condition command originally (i.e. before the79aabb7308patch) used the CLI's "cond" command, and back then not passing a condition argument was clearing out the condition. So, this is a regression in terms of the behavior. Fix the argument handling of the -break-condition command to allow not having a condition argument, and also update the document to make the behavior clear. Also add test cases to test the scenarios which were previously not covered. [1] https://sourceware.org/bugzilla/show_bug.cgi?id=28076
This commit is contained in:
@@ -30565,7 +30565,7 @@ times="0"@}
|
|||||||
@subsubheading Synopsis
|
@subsubheading Synopsis
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
-break-condition [ --force ] @var{number} @var{expr}
|
-break-condition [ --force ] @var{number} [ @var{expr} ]
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
Breakpoint @var{number} will stop the program only if the condition in
|
Breakpoint @var{number} will stop the program only if the condition in
|
||||||
@@ -30573,7 +30573,8 @@ Breakpoint @var{number} will stop the program only if the condition in
|
|||||||
@samp{-break-list} output (see the description of the @samp{-break-list}
|
@samp{-break-list} output (see the description of the @samp{-break-list}
|
||||||
command below). If the @samp{--force} flag is passed, the condition
|
command below). If the @samp{--force} flag is passed, the condition
|
||||||
is forcibly defined even when it is invalid for all locations of
|
is forcibly defined even when it is invalid for all locations of
|
||||||
breakpoint @var{number}.
|
breakpoint @var{number}. If the @var{expr} argument is omitted,
|
||||||
|
breakpoint @var{number} becomes unconditional.
|
||||||
|
|
||||||
@subsubheading @value{GDBN} Command
|
@subsubheading @value{GDBN} Command
|
||||||
|
|
||||||
|
|||||||
@@ -423,20 +423,19 @@ mi_cmd_break_condition (const char *command, char **argv, int argc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* There must be at least two more args: a bpnum and a condition
|
/* There must be at least one more arg: a bpnum. */
|
||||||
expression. */
|
if (oind >= argc)
|
||||||
if (oind + 1 >= argc)
|
error (_("-break-condition: Missing the <number> argument"));
|
||||||
error (_("-break-condition: Missing the <number> and/or <expr> "
|
|
||||||
"argument"));
|
|
||||||
|
|
||||||
int bpnum = atoi (argv[oind]);
|
int bpnum = atoi (argv[oind]);
|
||||||
|
|
||||||
/* The rest form the condition expr. */
|
/* The rest form the condition expr. */
|
||||||
std::string expr (argv[oind + 1]);
|
std::string expr = "";
|
||||||
for (int i = oind + 2; i < argc; ++i)
|
for (int i = oind + 1; i < argc; ++i)
|
||||||
{
|
{
|
||||||
expr += " ";
|
|
||||||
expr += argv[i];
|
expr += argv[i];
|
||||||
|
if (i + 1 < argc)
|
||||||
|
expr += " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
set_breakpoint_condition (bpnum, expr.c_str (), 0 /* from_tty */,
|
set_breakpoint_condition (bpnum, expr.c_str (), 0 /* from_tty */,
|
||||||
|
|||||||
@@ -435,6 +435,28 @@ proc_with_prefix test_forced_conditions {} {
|
|||||||
mi_gdb_test "-break-info 16" \
|
mi_gdb_test "-break-info 16" \
|
||||||
"\\^done,[mi_make_breakpoint_table [list $bp]]" \
|
"\\^done,[mi_make_breakpoint_table [list $bp]]" \
|
||||||
"invalid condition is defined"
|
"invalid condition is defined"
|
||||||
|
|
||||||
|
# No cond argument should clear the condition.
|
||||||
|
mi_gdb_test "-break-condition 16" \
|
||||||
|
"~\"Breakpoint 16's condition is now valid at location 1, enabling.*\\^done" \
|
||||||
|
"clear the condition"
|
||||||
|
set bp [mi_make_breakpoint -number 16]
|
||||||
|
mi_gdb_test "-break-info 16" \
|
||||||
|
"\\^done,[mi_make_breakpoint_table [list $bp]]" \
|
||||||
|
"condition is cleared"
|
||||||
|
|
||||||
|
# Zero-argument is an error.
|
||||||
|
mi_gdb_test "-break-condition" \
|
||||||
|
"\\^error,msg=\"-break-condition: Missing the <number> argument\"" \
|
||||||
|
"no arguments to -break-condition"
|
||||||
|
|
||||||
|
# Passing --force with no condition should not crash or raise an error.
|
||||||
|
mi_gdb_test "-break-condition --force 16" \
|
||||||
|
"\\^done" \
|
||||||
|
"clear the condition with --force"
|
||||||
|
mi_gdb_test "-break-condition --force" \
|
||||||
|
"\\^error,msg=\"-break-condition: Missing the <number> argument\"" \
|
||||||
|
"no arguments with --force"
|
||||||
}
|
}
|
||||||
|
|
||||||
proc test_break {mi_mode} {
|
proc test_break {mi_mode} {
|
||||||
|
|||||||
Reference in New Issue
Block a user