diff options
author | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2021-07-26 08:25:03 +0200 |
---|---|---|
committer | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2021-07-26 08:46:02 +0200 |
commit | b6c4205149824bfc3e5ab9e12819dcc0fc2af29d (patch) | |
tree | 62da7978ba7ce96065827a9c07095dbc1049ca70 /gdb | |
parent | b924d9bad57a1ddb2e0f83229db5a33b5fb7bec6 (diff) | |
download | binutils-b6c4205149824bfc3e5ab9e12819dcc0fc2af29d.zip binutils-b6c4205149824bfc3e5ab9e12819dcc0fc2af29d.tar.gz binutils-b6c4205149824bfc3e5ab9e12819dcc0fc2af29d.tar.bz2 |
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 (79aabb7308c "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 the 79aabb7308c
patch) 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
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/doc/gdb.texinfo | 5 | ||||
-rw-r--r-- | gdb/mi/mi-cmd-break.c | 15 | ||||
-rw-r--r-- | gdb/testsuite/gdb.mi/mi-break.exp | 22 |
3 files changed, 32 insertions, 10 deletions
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 386cef7..f4ce3d3 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -30565,7 +30565,7 @@ times="0"@} @subsubheading Synopsis @smallexample - -break-condition [ --force ] @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 @@ -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} 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}. +breakpoint @var{number}. If the @var{expr} argument is omitted, +breakpoint @var{number} becomes unconditional. @subsubheading @value{GDBN} Command diff --git a/gdb/mi/mi-cmd-break.c b/gdb/mi/mi-cmd-break.c index 5439937..c2d642d 100644 --- a/gdb/mi/mi-cmd-break.c +++ b/gdb/mi/mi-cmd-break.c @@ -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 - expression. */ - if (oind + 1 >= argc) - error (_("-break-condition: Missing the <number> and/or <expr> " - "argument")); + /* There must be at least one more arg: a bpnum. */ + if (oind >= argc) + error (_("-break-condition: Missing the <number> 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) + std::string expr = ""; + for (int i = oind + 1; i < argc; ++i) { - expr += " "; expr += argv[i]; + if (i + 1 < argc) + expr += " "; } set_breakpoint_condition (bpnum, expr.c_str (), 0 /* from_tty */, diff --git a/gdb/testsuite/gdb.mi/mi-break.exp b/gdb/testsuite/gdb.mi/mi-break.exp index 430ce6f..7d01a93 100644 --- a/gdb/testsuite/gdb.mi/mi-break.exp +++ b/gdb/testsuite/gdb.mi/mi-break.exp @@ -435,6 +435,28 @@ proc_with_prefix test_forced_conditions {} { mi_gdb_test "-break-info 16" \ "\\^done,[mi_make_breakpoint_table [list $bp]]" \ "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} { |