gdb/dap: check for breakpoint source before unpacking
authorGregory Anders <greg@gpanders.com>
Fri, 1 Sep 2023 21:02:17 +0000 (16:02 -0500)
committerTom Tromey <tromey@adacore.com>
Wed, 20 Sep 2023 16:59:32 +0000 (10:59 -0600)
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>
gdb/python/lib/gdb/dap/breakpoint.py
gdb/testsuite/gdb.dap/bt-nodebug.exp

index 1622ae69023e541136155af1ff36525ddcfeb549..bf062985671299b563058b8487cf9da6214f8a39 100644 (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
index e9726d2e17d76f563c98bac612bcd30c0a87be44..abd394adbff312eeee7a929603bbcf24a58b67b7 100644 (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