1# Copyright 2009-2020 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 file is part of the GDB testsuite. It tests precord debugging 17# with shared libraries and a logfile. 18 19# This test suitable only for process record-replay 20if ![supports_process_record] { 21 return 22} 23if {[skip_shlib_tests]} { 24 return 25} 26 27standard_testfile solib-reverse.c 28set precsave [standard_output_file solib.precsave] 29set lib1file "shr1" 30set lib1src ${lib1file}.c 31set library1 [standard_output_file ${lib1file}.sl] 32set lib2file "shr2" 33set lib2src ${lib2file}.c 34set library2 [standard_output_file ${lib2file}.sl] 35 36if [get_compiler_info] { 37 return -1 38} 39 40# Compile the first without debug info so that 41# stepping and reverse stepping doesn't end up inside them. 42if { [gdb_compile_shlib ${srcdir}/${subdir}/${lib1src} ${library1} ""] != "" } { 43 untested "failed to compile shared library 1" 44 return -1 45} 46 47if { [gdb_compile_shlib ${srcdir}/${subdir}/${lib2src} ${library2} "debug"] != "" } { 48 untested "failed to compile shared library 2" 49 return -1 50} 51 52set exec_opts [list debug shlib=${library1} shlib=${library2}] 53 54# Attempt to prevent -Wl,-z,relro which may happen by default with some 55# toolchain configurations. Due to PR corefiles/11804 GDB will then produce 56# invalid core file. 57 58if { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile} executable \ 59 [concat $exec_opts additional_flags=-Wl,-z,norelro]] != "" 60 && [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile} executable $exec_opts] != "" } { 61 untested "failed to compile" 62 return -1 63} 64 65# Start with a fresh gdb. 66 67gdb_exit 68gdb_start 69 70# Note: The test previously did "set debug-file-directory" to (try to) 71# ensure the debug info for the dynamic loader and libc weren't found. 72# This doesn't work if the debug info is in the .debug subdirectory. 73# Avoiding debug info for system libraries is not germaine to this test 74# and is no longer attempted. Instead, the test does not make assumptions 75# about whether the debug info is present or not. 76 77gdb_reinitialize_dir $srcdir/$subdir 78gdb_load ${binfile} 79gdb_load_shlib $library1 80gdb_load_shlib $library2 81 82runto main 83 84if [supports_process_record] { 85 # Activate process record/replay 86 gdb_test_no_output "record" "turn on process record" 87} 88 89set end_of_main [gdb_get_line_number "end of main" ] 90gdb_test "break $end_of_main" \ 91 "Breakpoint $decimal at .*$srcfile, line $end_of_main\." \ 92 "breakpoint at end of main" 93 94gdb_test_multiple "continue" "run to end of main" { 95 -wrap -re "Breakpoint .* end of main .*" { 96 pass $gdb_test_name 97 } 98 -wrap -re "Process record does not support instruction 0xfae64 at.*" { 99 kfail "gdb/25038" $gdb_test_name 100 return -1 101 } 102} 103 104gdb_test "record save $precsave" \ 105 "Saved core file $precsave with execution log\." \ 106 "save process recfile" 107 108gdb_test "kill" "" "kill process, prepare to debug log file" \ 109 "Kill the program being debugged\\? \\(y or n\\) " "y" 110 111gdb_test "record restore $precsave" \ 112 "Restored records from core file .*" \ 113 "reload core file" 114 115# 116# Test reverse-step over undebuggable solib functions. 117# 118 119# Run forward past some solib function calls. 120 121set end_part_one [gdb_get_line_number " end part one" "$srcfile"] 122set end_part_two [gdb_get_line_number " end part two" "$srcfile"] 123gdb_test "until $end_part_one" " end part one.*" "run until end part one" 124 125gdb_test "reverse-step" " shr1 three .*" "reverse-step third shr1" 126gdb_test "reverse-step" " shr1 two .*" "reverse-step second shr1" 127gdb_test "reverse-step" " shr1 one .*" "reverse-step first shr1" 128 129gdb_test "reverse-step" " generic statement.*" "reverse-step generic" 130 131 132# 133# Test reverse-next over undebuggable solib functions. 134# 135 136# Run forward again... 137 138gdb_test "until $end_part_one" " end part one.*" "forward to end part one" 139 140gdb_test "reverse-next" " shr1 three .*" "reverse-next third shr1" 141gdb_test "reverse-next" " shr1 two .*" "reverse-next second shr1" 142gdb_test "reverse-next" " shr1 one .*" "reverse-next first shr1" 143 144gdb_test "reverse-next" " generic statement.*" "reverse-next generic" 145 146 147# 148# Test reverse-step into debuggable solib function 149# 150 151gdb_test_multiple "reverse-step" "reverse-step into solib function one" { 152 -re -wrap "middle part two.*" { 153 send_gdb "reverse-step\n" 154 exp_continue 155 } 156 -re -wrap "${lib2src}.*" { 157 pass $gdb_test_name 158 } 159} 160gdb_test "reverse-step" "return 2.x.*" "reverse-step within solib function one" 161gdb_test "reverse-step" " middle part two.*" "reverse-step back to main one" 162 163gdb_test_multiple "reverse-step" "reverse-step into solib function two" { 164 -re -wrap "begin part two.*" { 165 send_gdb "reverse-step\n" 166 exp_continue 167 } 168 -re -wrap "${lib2src}.*" { 169 pass $gdb_test_name 170 } 171} 172gdb_test "reverse-step" "return 2.x.*" "reverse-step within solib function two" 173gdb_test "reverse-step" " begin part two.*" "reverse-step back to main two" 174 175# 176# Test reverse-next over debuggable solib function 177# 178 179gdb_test "until $end_part_two" " end part two.*" "run until end part two" 180 181gdb_test "reverse-next" " middle part two.*" "reverse-next over solib function one" 182gdb_test_multiple "reverse-next" "reverse-next over solib function two" { 183 -re -wrap "middle part two.*" { 184 send_gdb "reverse-next\n" 185 exp_continue 186 } 187 -re -wrap " begin part two.*" { 188 pass $gdb_test_name 189 } 190} 191