gdb/dap: check for breakpoint source before unpacking

Not all breakpoints have a source location. For example, a breakpoint
set on a raw address will have only the "address" field populated, but
"source" will be None, which leads to a RuntimeError when attempting to
unpack the filename and line number.

Before attempting to unpack the filename and line number from the
breakpoint, ensure that the source information is not None. Also
populate the source and line information separately from the
"instructionReference" field, so that breakpoints that include only an
address are still included.

Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Gregory Anders 2023-09-01 16:02:17 -05:00 committed by Tom Tromey
parent 4abf53c991
commit 155f5df517
2 changed files with 19 additions and 8 deletions

View File

@ -106,14 +106,18 @@ def _breakpoint_descriptor(bp):
# multiple locations. See
# https://github.com/microsoft/debug-adapter-protocol/issues/13
loc = bp.locations[0]
(filename, line) = loc.source
result.update(
{
"source": make_source(filename, os.path.basename(filename)),
"line": line,
"instructionReference": hex(loc.address),
}
)
if loc.source:
(filename, line) = loc.source
result.update(
{
"source": make_source(filename, os.path.basename(filename)),
"line": line,
}
)
if loc.address:
result["instructionReference"] = hex(loc.address),
path = loc.fullname
if path is not None:
result["source"]["path"] = path

View File

@ -53,4 +53,11 @@ gdb_assert {[llength $frames] == 3} "three frames"
gdb_assert {[dict get [lindex $frames 1] name] == "no_debug_info"} \
"name of no-debug frame"
# Breakpoint can be set without source file information
set obj [dap_check_request_and_response "set breakpoint on no_debug_info" \
setFunctionBreakpoints \
{o breakpoints [a [o name [s no_debug_info]]]}]
set breakpoints [dict get [lindex $obj 0] body breakpoints]
gdb_assert {[dict exists [lindex $breakpoints 0] instructionReference]} "breakpoint has instructionReference"
dap_shutdown