diff options
author | Tom de Vries <tdevries@suse.de> | 2020-08-28 12:02:20 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2020-08-28 12:02:20 +0200 |
commit | 626d23209fa3632561bb02ac11cb522bede91c1e (patch) | |
tree | a82be0be29eee3081670b6b44ba715df383268c8 /gdb/linespec.c | |
parent | 0861f561ebdd283e389c2c2fdb099bffadffecfa (diff) | |
download | gdb-626d23209fa3632561bb02ac11cb522bede91c1e.zip gdb-626d23209fa3632561bb02ac11cb522bede91c1e.tar.gz gdb-626d23209fa3632561bb02ac11cb522bede91c1e.tar.bz2 |
[gdb/breakpoint] Handle setting breakpoint on label without address
Consider test-case test.c:
...
$ cat test.c
int main (void) {
return 0;
L1:
(void)0;
}
...
Compiled with debug info:
...
$ gcc test.c -g
...
When attempting to set a breakpoint at L1, which is a label without address:
...
<1><f4>: Abbrev Number: 2 (DW_TAG_subprogram)
<f5> DW_AT_name : main
<2><115>: Abbrev Number: 3 (DW_TAG_label)
<116> DW_AT_name : L1
<119> DW_AT_decl_file : 1
<11a> DW_AT_decl_line : 5
<2><11b>: Abbrev Number: 0
...
we run into an internal-error:
...
$ gdb -batch a.out -ex "b main:L1"
linespec.c:3233: internal-error: void \
decode_line_full(const event_location*, int, program_space*, symtab*, \
int, linespec_result*, const char*, const char*): \
Assertion `result.size () == 1 || canonical->pre_expanded' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
...
Fix this by detecting the error condition in decode_line_full instead, and
throwing an error, such that we have instead:
...
(gdb) b main:L1
Location main:L1 not available
(gdb)
...
Unfortunately, to call event_location_to_string, which is used to get the
location name in the error message, we need to pass a non-const struct
event_location, because the call may cache the string in the struct (See
EL_STRING). So, we change the prototype of decode_line_full accordingly, and
everywhere this propages to.
Tested on x86_64-linux.
gdb/ChangeLog:
2020-08-28 Tom de Vries <tdevries@suse.de>
PR breakpoint/26544
* breakpoint.c (parse_breakpoint_sals): Remove const from struct
event_location.
(create_breakpoint): Same.
(base_breakpoint_decode_location): Same.
(bkpt_create_sals_from_location): Same.
(bkpt_decode_location): Same.
(bkpt_probe_create_sals_from_location): Same.
(bkpt_probe_decode_location): Same.
(tracepoint_create_sals_from_location): Same.
(tracepoint_decode_location): Same.
(tracepoint_probe_decode_location): Same.
(strace_marker_create_sals_from_location): Same.
(strace_marker_decode_location): Same.
(create_sals_from_location_default): Same.
(decode_location_default): Same.
* breakpoint.h (struct breakpoint_ops): Same.
(create_breakpoint): Same.
* linespec.h (decode_line_full): Same.
* linespec.c (decode_line_full): Same. Throw error if
result.size () == 0.
gdb/testsuite/ChangeLog:
2020-08-28 Tom de Vries <tdevries@suse.de>
* gdb.base/label-without-address.c: New test.
* gdb.base/label-without-address.exp: New file.
Diffstat (limited to 'gdb/linespec.c')
-rw-r--r-- | gdb/linespec.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/gdb/linespec.c b/gdb/linespec.c index 4a634e3..e8f3d59 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -3201,7 +3201,7 @@ event_location_to_sals (linespec_parser *parser, /* See linespec.h. */ void -decode_line_full (const struct event_location *location, int flags, +decode_line_full (struct event_location *location, int flags, struct program_space *search_pspace, struct symtab *default_symtab, int default_line, struct linespec_result *canonical, @@ -3230,6 +3230,10 @@ decode_line_full (const struct event_location *location, int flags, location); state = PARSER_STATE (&parser); + if (result.size () == 0) + throw_error (NOT_SUPPORTED_ERROR, _("Location %s not available"), + event_location_to_string (location)); + gdb_assert (result.size () == 1 || canonical->pre_expanded); canonical->pre_expanded = 1; |