From: Simon Marchi <simark@simark.ca>
To: Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>,
gdb-patches@sourceware.org
Subject: Re: [PATCH v2 1/2] gdb/breakpoint: disable a bp location if condition is invalid at that location
Date: Fri, 18 Sep 2020 23:05:31 -0400 [thread overview]
Message-ID: <bb049317-14b7-7010-bcf2-5c90ce0c77bd@simark.ca> (raw)
In-Reply-To: <f8586cf3f3492cc9af272e49aa25f1bc79161421.1597957849.git.tankut.baris.aktemur@intel.com>
Hi Baris,
I don't have much time right now, but I also don't want to delay looking
at this further, so here are a few comments. Overall, I think that this
is very well thought through and I like the behavior.
On 2020-08-20 5:24 p.m., Tankut Baris Aktemur via Gdb-patches wrote:
> Currently, for a conditional breakpoint, GDB checks if the condition
> can be evaluated in the context of the first symtab and line (SAL).
> In case of an error, defining the conditional breakpoint is aborted.
> This prevents having a conditional breakpoint whose condition may
> actually be meaningful for some of the location contexts. This patch
> makes it possible to define conditional BPs by checking all location
> contexts. If the condition is meaningful for even one context, the
> breakpoint is defined. The locations for which the condition gives
> errors are disabled.
>
> The bp_location struct is introduced a new field, 'disabled_by_cond'.
> This field denotes whether the location is disabled automatically
> because the condition was non-evaluatable. Disabled-by-cond locations
> cannot be enabled by the user. But locations that are not
> disabled-by-cond can be enabled/disabled by the user manually as
> before.
>
> For a concrete example, consider 3 contexts; func1, func2, and func3.
> Each context contains instructions coming from the same source.
> For instance:
>
> void
> func1 (int *value)
> {
> int a = 10;
> value += a;
> int b = 1;
> #include "included.c"
> }
>
> void
> func2 (int *value)
> {
> int b = 2;
> #include "included.c"
> }
>
> void
> func3 (int *value)
> {
> int c = 30;
> value += c;
> int b = 3;
> #include "included.c"
> }
A C++ example with overloaded functions would be simpler to understand,
I think.
>
> Note that
>
> * the variable 'a' is defined only in the context defined by func1.
> * the variable 'c' is defined only in the context defined by func3.
> * the variable 'b' is defined in all the three contexts.
>
> With the existing GDB, it's not possible to define a conditional
> breakpoint at "included.c:1" if the condition refers to 'a' or 'c':
>
> (gdb) break included.c:1 if a == 10
> No symbol "a" in current context.
> (gdb) break included.c:1 if c == 30
> No symbol "c" in current context.
> (gdb) info breakpoints
> No breakpoints or watchpoints.
>
> With this patch, it becomes possible:
>
> (gdb) break included.c:1 if a == 10
> warning: disabling breakpoint location 2: No symbol "a" in current context.
> warning: disabling breakpoint location 3: No symbol "a" in current context.
Though it would make the message a bit longer, I think it would be
important to mention in it that the location is disabled because GDB
failed to resolve (is the right word?) the condition at this location.
Most of the time it will be obvious, but I'm sure that in some cases it
won't be, and the user will be wondering what that error on the right is
about. Just one example, if the condition expression involves a macro
that hides some identifiers:
#define SOME_EXPR s
and
(gdb) b bar if SOME_EXPR
warning: disabling breakpoint location 2: No symbol "s" in current context.
Breakpoint 1 at 0x1120: bar. (2 locations)
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
stop only if SOME_EXPR
1.1 n 0x0000000000001120 in bar(int) at test.c:11
1.2 y 0x000000000000112b in bar(char const*) at test.c:15
I'm not sure what format is better:
warning: failed to resolve condition at location 2, disabing: No symbol "a" in current context.
vs
disabling breakpoint location 2: failed to resolve condition: No symbol "a" in current context.
vs
warning: failed to resolve condition at location 2: No symbol "a" in current context.
warning: disabling breakpoint location 2.
It's a bit annoying that the exception message is capitalized and has a
period, otherwise this would have been a good candidate:
warning: failed to resolve condition at location 2 (no symbol "a" in current context), disabling.
> Breakpoint 1 at 0x117d: included.c:1. (3 locations)
> (gdb) break included.c:1 if c == 30
> Note: breakpoint 1 also set at pc 0x117d.
> warning: disabling breakpoint location 1: No symbol "c" in current context.
> Note: breakpoint 1 also set at pc 0x119c.
> warning: disabling breakpoint location 2: No symbol "c" in current context.
> Note: breakpoint 1 also set at pc 0x11cf.
> Breakpoint 2 at 0x117d: included.c:1. (3 locations)
> (gdb) info break
> Num Type Disp Enb Address What
> 1 breakpoint keep y <MULTIPLE>
> stop only if a == 10
> 1.1 y 0x000000000000117d in func1 at included.c:1
> 1.2 n 0x000000000000119c in func2 at included.c:1
> 1.3 n 0x00000000000011cf in func3 at included.c:1
> 2 breakpoint keep y <MULTIPLE>
> stop only if c == 30
> 2.1 n 0x000000000000117d in func1 at included.c:1
> 2.2 n 0x000000000000119c in func2 at included.c:1
> 2.3 y 0x00000000000011cf in func3 at included.c:1
Should we somehow show in the listing that the locations disabled
because of the condition are disabled and can't be enabled? For
example, a capital N in the "Enb" column?
>
> Executing the code hits the breakpoints 1.1 and 2.3 as expected.
>
> Defining a condition on an unconditional breakpoint gives the same
> behavior above:
>
> (gdb) break included.c:1
> Breakpoint 1 at 0x117d: included.c:1. (3 locations)
> (gdb) cond 1 a == 10
> warning: disabling breakpoint 1.2: No symbol "a" in current context.
> warning: disabling breakpoint 1.3: No symbol "a" in current context.
> (gdb) info breakpoints
> Num Type Disp Enb Address What
> 1 breakpoint keep y <MULTIPLE>
> stop only if a == 10
> 1.1 y 0x000000000000117d in func1 at included.c:1
> 1.2 n 0x000000000000119c in func2 at included.c:1
> 1.3 n 0x00000000000011cf in func3 at included.c:1
>
> Locations that are disabled because of a condition cannot be enabled
> by the user:
>
> ...
> (gdb) enable 1.2
> Location is disabled because of the condition; cannot enable manually.
"because of the condition" does not sound clear to me. It does not say
what about the condition prevents the location from getting enabled.
What about something like "Breakpoint condition is invalid at location
1.2, cannot enable". Ideally, we should make sure that the messages we
output at different times should use the same vocabulary.
>
> Resetting the condition enables the locations back:
>
> ...
> (gdb) cond 1
> Breakpoint 1.2 is now enabled.
> Breakpoint 1.3 is now enabled.
Likewise, this doesn't say why these locations suddenly get enabled.
Should it? Something like "Breakpoint condition now resolves at
location 1.2, enabling.". Or is it obvious, because the user is already
using the "condition" command?
> Breakpoint 1 now unconditional.
> (gdb) info breakpoints
> Num Type Disp Enb Address What
> 1 breakpoint keep y <MULTIPLE>
> 1.1 y 0x000000000000117d in func1 at included.c:1
> 1.2 y 0x000000000000119c in func2 at included.c:1
> 1.3 y 0x00000000000011cf in func3 at included.c:1
>
> If a location is disabled by the user, a condition can still be defined
> but the location will remain disabled even if the condition is meaningful
> for the disabled location:
>
> ...
> (gdb) disable 1.1
> (gdb) cond 1 a == 10
> warning: disabling breakpoint 1.2: No symbol "a" in current context.
> warning: disabling breakpoint 1.3: No symbol "a" in current context.
> (gdb) info breakpoints
> Num Type Disp Enb Address What
> 1 breakpoint keep y <MULTIPLE>
> stop only if a == 10
> 1.1 n 0x000000000000117d in func1 at included.c:1
> 1.2 n 0x000000000000119c in func2 at included.c:1
> 1.3 n 0x00000000000011cf in func3 at included.c:1
If a location is already user-disabled and we install a condition that
condition-disables it, we print a "disabling" message:
(gdb) b bar
Breakpoint 1 at 0x1120: bar. (2 locations)
(gdb) disable 1.1 1.2
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
1.1 n 0x0000000000001120 in bar(int) at test.c:9
1.2 n 0x000000000000112b in bar(char const*) at test.c:13
(gdb) cond 1 s
warning: disabling breakpoint 1.1: No symbol "s" in current context.
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
stop only if s
1.1 n 0x0000000000001120 in bar(int) at test.c:9
1.2 n 0x000000000000112b in bar(char const*) at test.c:13
Should the "disabling breakpoint" message not be printed here, since it
doesn't really make sense to disable an already disabled breakpoint? If
the user tries to enable it back, then they'll get the "can't enable"
message.
> diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
> index 977599db1db..7abfd510abc 100644
> --- a/gdb/breakpoint.c
> +++ b/gdb/breakpoint.c
> @@ -830,6 +830,48 @@ get_first_locp_gte_addr (CORE_ADDR address)
> return locp_found;
> }
>
> +/* Parse COND_STRING in the context of LOC and set as the condition
> + expression of LOC. BP_NUM is the number of LOC's owner, LOC_NUM is
> + the number of LOC within its owner. In case of parsing error, mark
> + LOC as DISABLED_BY_COND. In case of success, unset DISABLED_BY_COND. */
> +
> +static void
> +set_breakpoint_location_condition (const char *cond_string, bp_location *loc,
> + int bp_num, int loc_num)
> +{
> + bool has_junk = false;
> + try
> + {
> + expression_up new_exp = parse_exp_1 (&cond_string, loc->address,
> + block_for_pc (loc->address), 0);
> + if (*cond_string != 0)
> + has_junk = true;
> + else
> + {
> + loc->cond = std::move (new_exp);
> + if (loc->disabled_by_cond && loc->enabled)
> + printf_filtered (_("Breakpoint %d.%d is now enabled.\n"),
> + bp_num, loc_num);
> +
> + loc->disabled_by_cond = false;
> + }
> + }
> + catch (const gdb_exception_error &e)
> + {
> + if (bp_num != 0)
> + warning (_("disabling breakpoint %d.%d: %s"),
> + bp_num, loc_num, e.what ());
> + else
> + warning (_("disabling breakpoint location %d: %s"),
> + loc_num, e.what ());
When is bp_num 0?
> @@ -14157,6 +14258,10 @@ enable_disable_bp_num_loc (int bp_num, int loc_num, bool enable)
> struct bp_location *loc = find_location_by_number (bp_num, loc_num);
> if (loc != NULL)
> {
> + if (loc->disabled_by_cond && enable)
> + error(_("Location is disabled because of the condition; "
Space after "error".
Simon
next prev parent reply other threads:[~2020-09-19 3:05 UTC|newest]
Thread overview: 103+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-31 15:42 [PATCH 0/2] Breakpoint conditions at locations with differing contexts Tankut Baris Aktemur
[not found] ` <cover.1596209606.git.tankut.baris.aktemur@intel.com>
2020-07-31 15:42 ` [PATCH 1/2] gdb/breakpoint: disable a bp location if condition is invalid at that location Tankut Baris Aktemur
2020-07-31 15:42 ` [RFC][PATCH 2/2] gdb/breakpoint: add a '-force' flag to the 'condition' command Tankut Baris Aktemur
2020-08-03 10:28 ` Andrew Burgess
2020-08-20 21:24 ` [PATCH v2 0/2] Breakpoint conditions at locations with differing contexts Tankut Baris Aktemur
2020-08-20 21:24 ` [PATCH v2 1/2] gdb/breakpoint: disable a bp location if condition is invalid at that location Tankut Baris Aktemur
2020-09-19 3:05 ` Simon Marchi [this message]
2020-09-25 15:49 ` Aktemur, Tankut Baris via Gdb-patches
2020-09-25 16:10 ` Simon Marchi
2020-09-25 18:15 ` Aktemur, Tankut Baris via Gdb-patches
2020-10-13 12:24 ` Aktemur, Tankut Baris via Gdb-patches
2020-08-20 21:24 ` [PATCH v2 2/2] gdb/breakpoint: add flags to 'condition' and 'break' commands to force condition Tankut Baris Aktemur
2020-09-04 11:02 ` [PATCH v2 0/2] Breakpoint conditions at locations with differing contexts Tankut Baris Aktemur
2020-09-11 11:56 ` Tankut Baris Aktemur
2020-09-18 20:36 ` [PING][PATCH " Tankut Baris Aktemur
2020-09-25 15:51 ` [PATCH v3 " Tankut Baris Aktemur via Gdb-patches
2020-09-25 15:51 ` [PATCH v3 1/2] gdb/breakpoint: disable a bp location if condition is invalid at that location Tankut Baris Aktemur via Gdb-patches
2020-09-25 15:51 ` [PATCH v3 2/2] gdb/breakpoint: add flags to 'condition' and 'break' commands to force condition Tankut Baris Aktemur via Gdb-patches
2020-10-13 12:25 ` [PATCH v4 0/2] Breakpoint conditions at locations with differing contexts Tankut Baris Aktemur via Gdb-patches
2020-10-13 12:25 ` [PATCH v4 1/2] gdb/breakpoint: disable a bp location if condition is invalid at that location Tankut Baris Aktemur via Gdb-patches
2020-10-13 15:06 ` Eli Zaretskii via Gdb-patches
2020-10-13 15:17 ` Aktemur, Tankut Baris via Gdb-patches
2020-10-16 22:20 ` Simon Marchi
2020-10-13 12:25 ` [PATCH v4 2/2] gdb/breakpoint: add flags to 'condition' and 'break' commands to force condition Tankut Baris Aktemur via Gdb-patches
2020-10-13 15:08 ` Eli Zaretskii via Gdb-patches
2020-10-13 15:46 ` Aktemur, Tankut Baris via Gdb-patches
2020-10-13 16:12 ` Eli Zaretskii via Gdb-patches
2020-10-16 22:45 ` Simon Marchi
2020-10-19 13:58 ` Aktemur, Tankut Baris via Gdb-patches
2020-10-19 14:07 ` Simon Marchi
2020-10-27 10:13 ` Aktemur, Tankut Baris via Gdb-patches
2020-10-29 10:10 ` Tom de Vries
2020-10-29 10:30 ` Aktemur, Tankut Baris via Gdb-patches
2020-10-29 17:30 ` Pedro Alves
2020-11-10 19:33 ` Aktemur, Tankut Baris via Gdb-patches
2020-12-05 17:30 ` Pedro Alves
2020-12-10 20:30 ` Tom Tromey
2020-12-15 11:20 ` Aktemur, Tankut Baris via Gdb-patches
2020-11-10 19:51 ` Aktemur, Tankut Baris via Gdb-patches
2020-10-28 16:57 ` [PATCH v4 0/2] Breakpoint conditions at locations with differing contexts Gary Benson via Gdb-patches
2020-10-29 7:43 ` Aktemur, Tankut Baris via Gdb-patches
2021-04-05 17:45 ` [PATCH " Jonah Graham
2021-04-06 14:11 ` Aktemur, Tankut Baris via Gdb-patches
2021-04-06 14:37 ` Jonah Graham
2021-04-07 7:09 ` Aktemur, Tankut Baris via Gdb-patches
2021-04-07 11:26 ` Jonah Graham
2021-04-07 14:55 ` [PATCH 0/4] Multi-context invalid breakpoint conditions and MI Tankut Baris Aktemur via Gdb-patches
2021-04-07 14:55 ` [PATCH 1/4] gdb/doc: update the 'enabled' field's description for BP locations in MI Tankut Baris Aktemur via Gdb-patches
2021-04-07 15:15 ` Eli Zaretskii via Gdb-patches
2021-04-07 21:42 ` Simon Marchi via Gdb-patches
2021-04-07 14:55 ` [PATCH 2/4] testsuite, gdb.mi: fix duplicate test names in mi-break.exp Tankut Baris Aktemur via Gdb-patches
2021-04-07 21:49 ` Simon Marchi via Gdb-patches
2021-04-07 14:55 ` [PATCH 3/4] gdb/breakpoint: add a 'force_condition' parameter to 'create_breakpoint' Tankut Baris Aktemur via Gdb-patches
2021-04-07 22:08 ` Simon Marchi via Gdb-patches
2021-04-08 7:44 ` Aktemur, Tankut Baris via Gdb-patches
2021-04-08 13:59 ` Simon Marchi via Gdb-patches
2021-04-08 14:19 ` Aktemur, Tankut Baris via Gdb-patches
2021-04-07 14:55 ` [PATCH 4/4] gdb/mi: add a '-b' flag to the '-break-insert' cmd to force the condition Tankut Baris Aktemur via Gdb-patches
2021-04-07 15:18 ` Eli Zaretskii via Gdb-patches
2021-04-07 15:27 ` Aktemur, Tankut Baris via Gdb-patches
2021-04-07 15:53 ` Eli Zaretskii via Gdb-patches
2021-04-07 16:05 ` Aktemur, Tankut Baris via Gdb-patches
2021-04-07 16:50 ` Eli Zaretskii via Gdb-patches
2021-04-07 22:26 ` Simon Marchi via Gdb-patches
2021-04-08 14:22 ` [PATCH v2 0/4] Multi-context invalid breakpoint conditions and MI Tankut Baris Aktemur via Gdb-patches
2021-04-08 14:22 ` [PATCH v2 1/4] gdb/breakpoint: display "N" on MI for disabled-by-condition locations Tankut Baris Aktemur via Gdb-patches
2021-04-08 15:04 ` Eli Zaretskii via Gdb-patches
2021-04-08 14:22 ` [PATCH v2 2/4] testsuite, gdb.mi: fix duplicate test names in mi-break.exp Tankut Baris Aktemur via Gdb-patches
2021-04-08 14:22 ` [PATCH v2 3/4] gdb/breakpoint: add a 'force_condition' parameter to 'create_breakpoint' Tankut Baris Aktemur via Gdb-patches
2021-04-08 14:22 ` [PATCH v2 4/4] gdb/mi: add a '--force-condition' flag to the '-break-insert' cmd Tankut Baris Aktemur via Gdb-patches
2021-04-08 15:06 ` Eli Zaretskii via Gdb-patches
2021-04-08 15:12 ` Aktemur, Tankut Baris via Gdb-patches
2021-04-11 1:06 ` Jonah Graham
2021-04-11 1:12 ` Simon Marchi via Gdb-patches
2021-04-21 12:06 ` Aktemur, Tankut Baris via Gdb-patches
2021-04-21 12:36 ` Simon Marchi via Gdb-patches
2021-04-11 1:13 ` [PATCH v2 0/4] Multi-context invalid breakpoint conditions and MI Jonah Graham
2021-04-21 12:17 ` [PATCH v3 " Tankut Baris Aktemur via Gdb-patches
2021-04-21 12:17 ` [PATCH v3 1/4] gdb/breakpoint: display "N" on MI for disabled-by-condition locations Tankut Baris Aktemur via Gdb-patches
2021-04-21 12:48 ` Eli Zaretskii via Gdb-patches
2021-04-21 12:17 ` [PATCH v3 2/4] testsuite, gdb.mi: fix duplicate test names in mi-break.exp Tankut Baris Aktemur via Gdb-patches
2021-04-21 12:17 ` [PATCH v3 3/4] gdb/breakpoint: add a 'force_condition' parameter to 'create_breakpoint' Tankut Baris Aktemur via Gdb-patches
2021-04-21 13:18 ` Simon Marchi via Gdb-patches
2021-04-21 13:29 ` Aktemur, Tankut Baris via Gdb-patches
2021-04-21 14:28 ` Simon Marchi via Gdb-patches
2021-04-21 12:17 ` [PATCH v3 4/4] gdb/mi: add a '--force-condition' flag to the '-break-insert' cmd Tankut Baris Aktemur via Gdb-patches
2021-04-21 12:50 ` Eli Zaretskii via Gdb-patches
2021-04-21 13:37 ` Simon Marchi via Gdb-patches
2021-04-21 13:49 ` Aktemur, Tankut Baris via Gdb-patches
2021-04-21 14:26 ` Simon Marchi via Gdb-patches
2021-04-22 14:35 ` [PATCH v4 0/2] Multi-context invalid breakpoint conditions and MI Tankut Baris Aktemur via Gdb-patches
2021-04-22 14:35 ` [PATCH v4 1/2] gdb/mi: add a '--force-condition' flag to the '-break-insert' cmd Tankut Baris Aktemur via Gdb-patches
2021-05-06 2:40 ` Simon Marchi via Gdb-patches
2021-04-22 14:35 ` [PATCH v4 2/2] gdb/mi: add a '--force' flag to the '-break-condition' command Tankut Baris Aktemur via Gdb-patches
2021-04-22 14:47 ` Aktemur, Tankut Baris via Gdb-patches
2021-05-06 2:46 ` Simon Marchi via Gdb-patches
2021-05-06 8:50 ` Aktemur, Tankut Baris via Gdb-patches
2021-07-11 18:51 ` Jonah Graham
2021-07-12 0:25 ` Jonah Graham
2021-07-12 8:33 ` Aktemur, Tankut Baris via Gdb-patches
2021-05-05 15:57 ` [PATCH v4 0/2] Multi-context invalid breakpoint conditions and MI Aktemur, Tankut Baris via Gdb-patches
2021-04-07 21:24 ` [PATCH 0/2] Breakpoint conditions at locations with differing contexts Simon Marchi via Gdb-patches
2021-04-07 21:36 ` Jonah Graham
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=bb049317-14b7-7010-bcf2-5c90ce0c77bd@simark.ca \
--to=simark@simark.ca \
--cc=gdb-patches@sourceware.org \
--cc=tankut.baris.aktemur@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox