From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by sourceware.org (Postfix) with ESMTPS id 92AB339AF82E for ; Thu, 22 Apr 2021 14:36:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 92AB339AF82E IronPort-SDR: R28tcD4vvgyss41z215q9VnnYVrgt+3s3gS6Vl2hrJxm5O6WpkL7nELhzs7LbZruHO2SZ9eZhC jHy82idvLvXw== X-IronPort-AV: E=McAfee;i="6200,9189,9962"; a="281225808" X-IronPort-AV: E=Sophos;i="5.82,242,1613462400"; d="scan'208";a="281225808" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Apr 2021 07:36:07 -0700 IronPort-SDR: sYmoiPtuFGWZ/o+Q4MAhHj5FSnT7nMUw8u5bY6R4jdhnSNhJevgt61/E3YOqEXmV9SqqS4cY2Y QYdfNVhERB2A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,242,1613462400"; d="scan'208";a="535220523" Received: from irvmail001.ir.intel.com ([10.43.11.63]) by orsmga004.jf.intel.com with ESMTP; 22 Apr 2021 07:36:04 -0700 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id 13MEa3Fw018625; Thu, 22 Apr 2021 15:36:03 +0100 Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id 13MEa3r5028890; Thu, 22 Apr 2021 16:36:03 +0200 Received: (from taktemur@localhost) by ulvlx001.iul.intel.com with LOCAL id 13MEa3G4028886; Thu, 22 Apr 2021 16:36:03 +0200 From: Tankut Baris Aktemur To: gdb-patches@sourceware.org Subject: [PATCH v4 2/2] gdb/mi: add a '--force' flag to the '-break-condition' command Date: Thu, 22 Apr 2021 16:35:50 +0200 Message-Id: X-Mailer: git-send-email 1.7.0.7 In-Reply-To: References: In-Reply-To: References: X-Spam-Status: No, score=-14.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Apr 2021 14:36:13 -0000 Add a '--force' flag to the '-break-condition' command to be able to force conditions. gdb/ChangeLog: 2021-04-21 Tankut Baris Aktemur * 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-04-21 Tankut Baris Aktemur * gdb.mi/mi-break.exp (test_forced_conditions): Add a test for the -break-condition command's "--force" flag. gdb/doc/ChangeLog: 2021-04-21 Tankut Baris Aktemur * gdb.texinfo (GDB/MI Breakpoint Commands): Mention the '--force' flag of the '-break-condition' command. --- gdb/NEWS | 7 ++++ gdb/breakpoint.c | 59 ++++++++++++++++++------------- gdb/breakpoint.h | 8 +++++ gdb/doc/gdb.texinfo | 6 ++-- gdb/mi/mi-cmd-break.c | 56 +++++++++++++++++++++++++++++ gdb/mi/mi-cmds.c | 4 +-- gdb/mi/mi-cmds.h | 1 + gdb/testsuite/gdb.mi/mi-break.exp | 11 ++++++ 8 files changed, 123 insertions(+), 29 deletions(-) diff --git a/gdb/NEWS b/gdb/NEWS index 72bceb7266f..27429280aa5 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -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 diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index c2d0ffba974..22899ca9117 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -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 diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index ded498f5562..2925f77df56 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -1657,6 +1657,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); diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index cac7ceb4665..a7e045b0544 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -30509,13 +30509,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 diff --git a/gdb/mi/mi-cmd-break.c b/gdb/mi/mi-cmd-break.c index fec75a8da5a..1a217ecab03 100644 --- a/gdb/mi/mi-cmd-break.c +++ b/gdb/mi/mi-cmd-break.c @@ -385,6 +385,62 @@ 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 arguments")); + + 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, diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index df4290ae5dc..1ed8b6f9126 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -45,8 +45,8 @@ 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, - &mi_suppress_notification.breakpoint), + 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), DEF_MI_CMD_CLI_1 ("break-delete", "delete breakpoint", 1, diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index 4c05a4734a8..8da2e393919 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -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; diff --git a/gdb/testsuite/gdb.mi/mi-break.exp b/gdb/testsuite/gdb.mi/mi-break.exp index 3b264ecdebd..b6ef3483004 100644 --- a/gdb/testsuite/gdb.mi/mi-break.exp +++ b/gdb/testsuite/gdb.mi/mi-break.exp @@ -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} { -- 2.17.1