1# Copyright (C) 2011-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 the program space 17# support in Python. 18 19load_lib gdb-python.exp 20 21standard_testfile 22 23if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } { 24 return -1 25} 26 27# Skip all tests if Python scripting is not enabled. 28if { [skip_python_tests] } { continue } 29 30if ![runto_main] then { 31 fail "can't run to main" 32 return 0 33} 34 35set python_error_text "Error while executing Python code\\." 36 37gdb_py_test_silent_cmd "python sym = gdb.lookup_symbol(\"some_var\")" \ 38 "Find a symbol in objfile" 1 39gdb_py_test_silent_cmd "python objfile = sym\[0\].symtab.objfile" \ 40 "Get backing object file" 1 41 42gdb_test "python print (objfile.filename)" "${testfile}" \ 43 "Get objfile file name" 44 45gdb_test "python print (objfile.username)" "${testfile}" \ 46 "Get objfile user name" 47 48gdb_test "python print (objfile)" \ 49 "<gdb.Objfile filename=.*${testfile}.*>" 50 51gdb_test_no_output "python dir(objfile)" 52 53gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").filename)" \ 54 "${testfile}" "print lookup_objfile filename" 55gdb_test "python print (gdb.lookup_objfile (\"junk\"))" \ 56 "Objfile not found\\.\r\n${python_error_text}" 57 58gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"global_var\").name)" \ 59 "global_var" "lookup_global_symbol finds a valid symbol" 60gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"static_var\") is None)" \ 61 "True" "lookup_global_symbol does not find static symbol" 62gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"stdout\"))" \ 63 "None" "lookup_global_symbol doesn't find symbol in other objfile" 64 65gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_static_symbol (\"static_var\").name)" \ 66 "static_var" "lookup_static_symbol finds a valid symbol" 67gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_static_symbol (\"global_var\") is None)" \ 68 "True" "lookup_static_symbol does not find global symbol" 69gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_static_symbol (\"nonexistent\"))" \ 70 "None" "lookup_static_symbol can handle nonexistent symbol" 71 72set binfile_build_id [get_build_id $binfile] 73if [string compare $binfile_build_id ""] { 74 verbose -log "binfile_build_id = $binfile_build_id" 75 gdb_test "python print (objfile.build_id)" "$binfile_build_id" \ 76 "Get objfile build id" 77 gdb_test "python print (gdb.lookup_objfile (\"$binfile_build_id\", by_build_id=True).filename)" \ 78 "${testfile}" "print lookup_objfile filename by build-id" 79} else { 80 unsupported "build-id is not supported by the compiler" 81} 82 83# Other lookup_objfile_by_build_id tests we can do, even if compiler doesn't 84# support them. 85gdb_test "python print (gdb.lookup_objfile (\"foo\", by_build_id=True))" \ 86 "Not a valid build id\\.\r\n${python_error_text}" \ 87 "print invalid file lookup_objfile by build-id" 88gdb_test "python print (gdb.lookup_objfile (\"1234abcdef\", by_build_id=True))" \ 89 "Objfile not found\\.\r\n${python_error_text}" \ 90 "print invalid file lookup_objfile by build-id 2" 91 92gdb_test "python print (objfile.progspace)" "<gdb\.Progspace object at .*>" \ 93 "Get objfile program space" 94gdb_test "python print (objfile.is_valid())" "True" \ 95 "Get objfile validity" 96gdb_unload 97gdb_test "python print (objfile.is_valid())" "False" \ 98 "Get objfile validity after unload" 99 100gdb_py_test_silent_cmd "python objfile.random_attribute = 42" \ 101 "Set random attribute in objfile" 1 102gdb_test "python print (objfile.random_attribute)" "42" \ 103 "Verify set of random attribute in objfile" 104 105# Verify invalid objfile handling. 106 107if { [gdb_unload] < 0 } { 108 fail "unload all files" 109 return -1 110} 111 112gdb_test "python print(objfile.filename)" "None" \ 113 "objfile.filename after objfile is unloaded" 114gdb_test "python print(objfile.username)" "None" \ 115 "objfile.username after objfile is unloaded" 116 117# Now build another copy of the testcase, this time without debug info. 118 119if { [prepare_for_testing "failed to prepare" ${testfile}2 ${srcfile} {nodebug ldflags=-Wl,--strip-debug}] } { 120 return -1 121} 122 123if ![runto_main] { 124 fail "can't run to main" 125 return 0 126} 127 128gdb_py_test_silent_cmd "python objfile = gdb.objfiles()\[0\]" \ 129 "Get no-debug objfile file" 1 130 131gdb_test "python print (objfile.owner)" "None" \ 132 "Test owner of real objfile." 133 134gdb_test "p main" "= {<text variable, no debug info>} $hex <main>" \ 135 "print main without debug info" 136 137gdb_py_test_silent_cmd "python objfile.add_separate_debug_file(\"${binfile}\")" \ 138 "Add separate debug file file" 1 139 140gdb_py_test_silent_cmd "python sep_objfile = gdb.objfiles()\[0\]" \ 141 "Get separate debug info objfile" 1 142 143gdb_test "python print (sep_objfile.owner.filename)" "${testfile}2" \ 144 "Test owner of separate debug file" 145 146gdb_test "python print (sep_objfile.owner.username)" "${testfile}2" \ 147 "Test user-name of owner of separate debug file" 148 149gdb_test "p main" "= {int \\(\\)} $hex <main>" \ 150 "print main with debug info" 151 152# Separate debug files are not findable. 153if { [get_python_valueof "sep_objfile.build_id" "None"] != "None" } { 154 gdb_test "python print (gdb.lookup_objfile (sep_objfile.build_id, by_build_id=True))" \ 155 "Objfile not found\\.\r\n${python_error_text}" \ 156 "print lookup_objfile of separate debug file" 157} 158 159# An objfile that was a symlink to a differently named file is still 160# findable with its original name. 161# On Windows we don't have proper symlinks, so skip this. 162if ![ishost *-*-mingw*] { 163 set symlink_binary [standard_output_file "symlink-binary"] 164 remote_exec host "rm -f ${symlink_binary}" 165 remote_exec host "ln -sf ${testfile} ${symlink_binary}" 166 if [remote_file host exists "${symlink_binary}"] { 167 clean_restart "${symlink_binary}" 168 gdb_test "python print (gdb.lookup_objfile (\"${symlink_binary}\").filename)" \ 169 "${testfile}" "gdb.lookup_objfile of symlinked binary" 170 } 171} 172 173# Test printing an Objfile object that is no longer valid. 174gdb_py_test_silent_cmd "python objfile = gdb.objfiles()\[0\]" \ 175 "get first objfile" 1 176gdb_file_cmd ${binfile} 177gdb_test "python print(objfile)" "<gdb.Objfile \\\(invalid\\\)>" 178