From: Gregory Anders Date: Fri, 1 Sep 2023 21:02:17 +0000 (-0500) Subject: gdb/dap: check for breakpoint source before unpacking X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=155f5df517c962f1317e119a6a5ca317e1202996;p=binutils-gdb.git 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 --- diff --git a/gdb/python/lib/gdb/dap/breakpoint.py b/gdb/python/lib/gdb/dap/breakpoint.py index 1622ae69023..bf062985671 100644 --- a/gdb/python/lib/gdb/dap/breakpoint.py +++ b/gdb/python/lib/gdb/dap/breakpoint.py @@ -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 diff --git a/gdb/testsuite/gdb.dap/bt-nodebug.exp b/gdb/testsuite/gdb.dap/bt-nodebug.exp index e9726d2e17d..abd394adbff 100644 --- a/gdb/testsuite/gdb.dap/bt-nodebug.exp +++ b/gdb/testsuite/gdb.dap/bt-nodebug.exp @@ -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