Home | History | Annotate | Line # | Download | only in gdb.debuginfod
      1 # Copyright 2022-2024 Free Software Foundation, Inc.
      2 
      3 # This program is free software; you can redistribute it and/or modify
      4 # it under the terms of the GNU General Public License as published by
      5 # the Free Software Foundation; either version 3 of the License, or
      6 # (at your option) any later version.
      7 #
      8 # This program is distributed in the hope that it will be useful,
      9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11 # GNU General Public License for more details.
     12 #
     13 # You should have received a copy of the GNU General Public License
     14 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15 #
     16 # This test compiles two executables: crc_mismatch and crc_mismatch-2
     17 # and then strips them of debuginfo creating separate debug files. The test
     18 # then replaces crc_mismatch-2.debug with crc_mismatch.debug to trigger
     19 # "CRC mismatch" warning. A local debuginfod server is setup to supply
     20 # the correct debug file, now when GDB looks up the debug info no warning
     21 # is given.
     22 
     23 standard_testfile .c -2.c
     24 
     25 load_lib debuginfod-support.exp
     26 
     27 require allow_debuginfod_tests
     28 
     29 if {[build_executable "build executable" $testfile $srcfile debug] == -1} {
     30     untested "failed to compile"
     31     return -1
     32 }
     33 
     34 # The procedure gdb_gnu_strip_debug will produce an executable called
     35 # ${binfile}, which is just like the executable ($binfile) but without
     36 # the debuginfo. Instead $binfile has a .gnu_debuglink section which
     37 # contains the name of a debuginfo only file.
     38 if {[gdb_gnu_strip_debug $binfile]} {
     39     # Check that you have a recent version of strip and objcopy installed.
     40     unsupported "cannot produce separate debug info files"
     41     return -1
     42 }
     43 
     44 set debugfile [standard_output_file ${testfile}.debug]
     45 set debugdir [standard_output_file "debug"]
     46 remote_exec build "mkdir $debugdir"
     47 remote_exec build "mkdir -p [file dirname $debugfile]"
     48 remote_exec build "mv -f [standard_output_file ${testfile}.debug] $debugfile"
     49 
     50 # Test CRC mismatch is reported.
     51 if {[build_executable crc_mismatch.exp crc_mismatch-2 crc_mismatch-2.c debug] != -1
     52     && ![gdb_gnu_strip_debug [standard_output_file crc_mismatch-2]]} {
     53 
     54     # Copy the correct debug file for crc_mismatch-2 to the debugdir
     55     # which is going to be used by local debuginfod.
     56     remote_exec build "cp [standard_output_file crc_mismatch-2.debug] ${debugdir}"
     57     # Move the unmatching debug file for crc_mismatch-2 instead of its real one
     58     # to trigger the "CRC mismatch" warning.
     59     remote_exec build "mv ${debugfile} [standard_output_file crc_mismatch-2.debug]"
     60 
     61     clean_restart
     62 
     63     set escapedobjdirsubdir [string_to_regexp [standard_output_file {}]]
     64     gdb_test "file [standard_output_file crc_mismatch-2]" \
     65 	[multi_line \
     66 	     "Reading symbols from ${escapedobjdirsubdir}/crc_mismatch-2\\.\\.\\." \
     67 	     "warning: the debug information found in \"${escapedobjdirsubdir}/crc_mismatch-2\\.debug\" does not match \"${escapedobjdirsubdir}/crc_mismatch-2\" \\(CRC mismatch\\)\\." \
     68 	     "\\(No debugging symbols found in .*\\)"] \
     69 	"CRC mismatch is reported"
     70 
     71     # Do the same thing again, but this time check that the styling is
     72     # correct.
     73     with_test_prefix "check styling" {
     74 	with_ansi_styling_terminal {
     75 	    clean_restart
     76 
     77 	    set debug_file_re [style "${escapedobjdirsubdir}/crc_mismatch-2\\.debug" file]
     78 	    set exe_file_re [style "${escapedobjdirsubdir}/crc_mismatch-2" file]
     79 
     80 	    gdb_test "file [standard_output_file crc_mismatch-2]" \
     81 		[multi_line \
     82 		     "Reading symbols from ${exe_file_re}\\.\\.\\." \
     83 		     "warning: the debug information found in \"${debug_file_re}\" does not match \"${exe_file_re}\" \\(CRC mismatch\\)\\." \
     84 		     "\\(No debugging symbols found in \[^\r\n\]+\\)"] \
     85 		"CRC mismatch is reported"
     86 	}
     87     }
     88 
     89     # Restart GDB with styling disabled.
     90     clean_restart
     91 }
     92 
     93 # Create CACHE and DB directories ready for debuginfod to use.
     94 prepare_for_debuginfod cache db
     95 
     96 # Start debuginfod server, test the correct debuginfo was fetched
     97 # from the server so there're not warnings anymore.
     98 proc_with_prefix local_debuginfod { } {
     99     global binfile db debugdir cache
    100     set escapedobjdirsubdir [string_to_regexp [standard_output_file {}]]
    101 
    102     set url [start_debuginfod $db $debugdir]
    103     if {$url eq ""} {
    104 	unresolved "failed to start debuginfod server"
    105 	return
    106     }
    107 
    108     # Point the client to the server.
    109     setenv DEBUGINFOD_URLS $url
    110 
    111     # GDB should now find the symbol and source files.
    112     clean_restart
    113 
    114     # Enable debuginfod and fetch the debuginfo.
    115     gdb_test_no_output "set debuginfod enabled on"
    116     gdb_test "file $binfile" ".*Reading symbols from.*debuginfo.*" \
    117 	"file [file tail $binfile] cmd on"
    118 
    119     # CRC mismatch should not be reported now because the correct debuginfo
    120     # should be fetched from debuginfod.
    121     gdb_test "file [standard_output_file crc_mismatch-2]" \
    122 	[multi_line \
    123 	     "Reading symbols from ${escapedobjdirsubdir}/crc_mismatch-2\\.\\.\\." \
    124 	     "Downloading.*separate debug info for ${escapedobjdirsubdir}/crc_mismatch-2\\.\\.\\." \
    125 	     "Reading symbols from ${cache}/\[^\r\n\]+\\.\\.\\.(?:\r\nExpanding full symbols from \[^\r\n\]+)*"] \
    126 	 "debuginfod running, info downloaded, no CRC mismatch"
    127 }
    128 
    129 with_debuginfod_env $cache {
    130     local_debuginfod
    131 }
    132 
    133 stop_debuginfod
    134 # Spare debug files may confuse testsuite runs in the future.
    135 remote_exec build "rm -f $debugfile"
    136