gdb/linespec.c: Fix missing source file during breakpoint re-set
authorAaron Merey <amerey@redhat.com>
Fri, 6 Jan 2023 23:45:27 +0000 (18:45 -0500)
committerAaron Merey <amerey@redhat.com>
Tue, 10 Jan 2023 00:47:10 +0000 (19:47 -0500)
During breakpoint re-setting, the source_filename of an
explicit_location_spec is used to lookup the symtabs associated with
the breakpoint being re-set.  This source_filename is compared with each
known symtab filename in order to retrieve the breakpoint's symtabs.

However the source_filename may have been originally copied from a
symtab's fullname (the path where GDB found the source file) when the
breakpoint was first created.  If a breakpoint symtab's filename and
fullname differ and there is no substitute-path rule that converts the
fullname to the filename, this will cause a NOT_FOUND_ERROR to be thrown
during re-setting.

Fix this by using a symtab's filename to set the explicit_location_spec
source_filename instead of the symtab's fullname.

gdb/linespec.c
gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp

index b8c77541a290616df906649da97406e3f3691131..d3def7ae07087ecf5cfec134c4b9e247ce915712 100644 (file)
@@ -2283,13 +2283,13 @@ convert_linespec_to_sals (struct linespec_state *state, linespec *ls)
        /* Make sure we have a filename for canonicalization.  */
        if (ls->explicit_loc.source_filename == NULL)
          {
-           const char *fullname = symtab_to_fullname (state->default_symtab);
+           const char *filename = state->default_symtab->filename;
 
            /* It may be more appropriate to keep DEFAULT_SYMTAB in its symtab
               form so that displaying SOURCE_FILENAME can follow the current
               FILENAME_DISPLAY_STRING setting.  But as it is used only rarely
               it has been kept for code simplicity only in absolute form.  */
-           ls->explicit_loc.source_filename = xstrdup (fullname);
+           ls->explicit_loc.source_filename = xstrdup (filename);
          }
     }
   else
index 6d5af1370b0fe7f06f04ac87547c9344ce60225e..bfe6e639e4f422bba22258ee8f59077a339e8bc2 100644 (file)
@@ -224,6 +224,15 @@ proc_with_prefix local_url { } {
     set lineno [gdb_get_line_number "Breakpoint here"]
     gdb_test "list $lineno" "return 0;\[^\r\n\]+Breakpoint here\\. .*"
 
+    # Verify that a breakpoint re-sets correctly when the actual location
+    # of the source file in the debuginfod client cache differs from
+    # the contents of DW_AT_comp_dir and DW_AT_name.
+    gdb_test "set cwd $debugdir" "" "file [file tail $binfile] cwd"
+    gdb_test_no_output "del breakpoint 1"
+    gdb_test "break $lineno" "Breakpoint 2 at.*file.*"
+    gdb_test "run" "Breakpoint 2.*" \
+       "file [file tail $binfile] set breakpoint"
+
     # GDB should now find the executable file.
     clean_restart
     gdb_test "core $::corefile" ".*return 0.*" "file [file tail $::corefile]" \