# Copyright 2003 # Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Please email any bugs, comments, and/or additions to this file to: # bug-gdb@prep.ai.mit.edu # This file was written by Serena Hartoog (hartoog@apple.com) # # This file is part of the gdb testsuite. # It tests cached symbol tables. # source file used is in cached-symfile-lib directory # load my own tcl library load_lib $srcdir/$subdir/cachedsym-proc.exp if $tracelevel then { strace $tracelevel } set prms_id 0 set bug_id 0 # global variables set mylibdir "cachedsym-lib" set libfile ${mylibdir}/cachedsym set libbindir ${objdir}/${subdir} set libbinfn "libcachedsym.dylib" set libbinfile ${libbindir}/${libbinfn} set testfile "cachedsymtest" set srcfile ${mylibdir}/${testfile}.c set binfile ${objdir}/${subdir}/${testfile} set cachedir "gdb-symfile-cache" set defcachedir "${objdir}/${cachedir}" set chbinfile "${defcachedir}/${testfile}.syms" set chlibbinfile "${defcachedir}/${libbinfn}.syms" gdb_suppress_entire_file "Cached symfiles disabled." return 0 verbose "\[DEBUG\] testfile=$testfile" 1 verbose "\[DEBUG\] libbinfile=$libbinfile" 1 verbose "\[DEBUG\] binfile=$binfile" 1 verbose "\[DEBUG\] srcfile=$srcfile" 1 verbose "\[DEBUG\] Default chached file dir, defcachedir=$defcachedir" 1 verbose "\[DEBUG\] chbinfile=$chbinfile" 1 verbose "\[DEBUG\] libbinfn=$libbinfn" 1 verbose "\[DEBUG\] chlibbinfile=$chlibbinfile" 1 # build dynamic library before compiling the program build_library # compile and link the program set additional_flags "additional_flags=-L${libbindir} -lcachedsym" if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } { gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." } gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir # remove any old cached symbol files before we start remote_exec build "rm -rf $defcachedir" remote_exec build "rm -rf $defcachedir.junk" remote_exec build "rm -rf $defcachedir.junk1" remote_exec build "rm -rf $defcachedir.junk2" remote_exec build "rm -rf $defcachedir.junk3" remote_exec build "rm -rf $defcachedir.junk4" if [ file exists ${defcachedir} ] { verbose "*** Ccached sym dir delete failed\n" 1 } else { verbose "*** Cached sym dir delete succeeded\n" 1 } # # test case 1: no gdb-symfile-cache dir before launching gdb, and do not set generate-cached-symfiles on # After loading, set generate-cached-symfiles on then load file again # gdb_test "file $binfile" \ "Reading symbols for shared libraries.*\r\nReading symbols from $binfile.*" \ "t1: load file without cached symfile" gdb_test "break main" \ "Breakpoint 1 at $hex: file.*${testfile}.*line.*" \ "t1: set break point at main" gdb_test "run" \ "Starting program: ${binfile}.*\[\r\n\]+Breakpoint 1, main.*\r\n5.*mylibFunc001.*" \ "t1: run program whitout setting generate-cached-symfiles on" gdb_test "set generate-cached-symfiles on" "" "t1: set generate-cached-symfiles on" send_gdb "file $binfile\n" gdb_expect { -re ".*A program is being debugged already.*Kill it.*y or n.*$" { send_gdb "y\n" gdb_expect { -re "Load new symbol table.*${binfile}.*y or n.*$" { send_gdb "y\n" gdb_expect { -re ".*Mapped symbols.*${binfile}.*$gdb_prompt $" { pass "t1: load file with generate-cached-symfiles on" } -re "$gdb_prompt $" { fail "t1: load file with generate-cached-symfiles on" } timeout { fail "t1: (timeout) load file with generate-cached-symfiles on" } } } -re "$gdb_prompt $" { fail "t1: load file with generate-cached-symfiles on" } timeout { fail "t1: (timeout) load file with generate-cached-symfiles on" } } } -re "$gdb_prompt $" { fail "t1: load file with generate-cached-symfiles on" } timeout { fail "t1: (timeout) load file with generate-cached-symfiles on" } } gdb_test "run" \ "Starting program: ${binfile}.*Breakpoint 1, main.*\r\n5.*mylibFunc001.*" \ "t1: run program with generate-cached-symfiles on" gdb_test "break main" \ "Note: breakpoint 1 also set at pc.*\r\nBreakpoint 2.*line 5\\." \ "t1: set break point at main again" gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir remote_exec build "mv $defcachedir $defcachedir.junk" # # test case 2: no gdb-symfile-cache dir before launching gdb, turn on generate-cached-symfiles # then load the file; turn off generate-cached-symfiles to load the file again # gdb_test "set generate-cached-symfiles on" "" "t2: turn on generate-cached-symfiles" gdb_test "show generate-cached-symfiles" \ "If GDB should generate persistent symbol tables by default is on\\." \ "t2: Check if generate-cached-symfiles on" gdb_test "file $binfile" \ "Reading symbols for shared libraries.*\r\nMapped symbols for ${binfile}.*" \ "t2: load file with cached symfile on" # show info shared library, verify cached symfile is correctly display gdb_test "info sharedlibrary" \ "The DYLD shared library.*1 ${testfile}.*exec.*${binfile}.*${chbinfile}.*3 ${libbinfn}.*${chlibbinfile}.*4.*dylib at $hex.*" \ "t2: check sharedlibrary for 1st time set up cached lib and load files" # set break point at main() gdb_test "break main" \ "Breakpoint 1 at $hex: file.*${testfile}.*line.*" \ "t2: set break point at main of case 2" # already have gdb-symfile-cache dir before launching gdb, and set generate-cached-symfiles off gdb_test "set generate-cached-symfiles off" "" "t2: turn generate-cached-symfiles off" gdb_test "show generate-cached-symfiles" \ "If GDB should generate persistent symbol tables by default is off\\." \ "t2: verify generate-cached-symfiles is turned off" send_gdb "file $binfile\n" gdb_expect { -re "Load new symbol table from \"$binfile\".*y or n.*$" { send_gdb "y\n" gdb_expect { -re "Mapped symbols for $binfile.*$gdb_prompt $" { pass "t2: loading program with preexisting symfiles and generate-cached-symfiles off" } -re "$gdb_prompt $" { fail "t2: loading program with preexisting symfiles and generate-cached-symfiles off" } timeout { fail "t2: (timeout) loading program with preexisting symfiles and generate-cached-symfiles off" } } } -re "$gdb_prompt $" { fail "t2: loading program with preexisting symfiles and generate-cached-symfiles off" } timeout { fail "t2: (timeout) loading program with preexisting symfiles and generate-cached-symfiles off" } } gdb_test "break main" \ "Note: breakpoint 1 also set at pc.*\r\nBreakpoint 2.*line 5\\." \ "t2: set break point at main again" gdb_test "run" \ "Starting program: ${binfile}.*\[\r\n\]+Breakpoint 1, main.*\r\n5.*mylibFunc001.*" \ "t2: run program with set generate-cached-symfiles on" # unload program (binfile) send_gdb "file\n" gdb_expect { -re "A program is being debugged already.*Kill it.*y or n.*$" { send_gdb "y\n" gdb_expect { -re "No executable file now.*Discard symbol table from.*${chbinfile}.*y or n.*$" { send_gdb "y\n" gdb_expect { -re "No symbol file now.*$gdb_prompt $" { pass "t2: unload program" } -re "$gdb_prompt $" { fail "t2: unload program" } timeout { fail "t2: (timeout) unload program" } } } } } -re "$gdb_prompt $" { fail "t2: unload program" } timeout { fail "t2: (timeout) unload program" } } # # test case 3: gdb-symfile-cache exists befoe we launch gdb again # gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir remote_exec build "mv $defcachedir $defcachedir.junk1" gdb_test "set generate-cached-symfiles on" "" "t3: turn on generate-cached-symfiles" gdb_test "show generate-cached-symfiles" \ "If GDB should generate persistent symbol tables by default is on\\." \ "t3: Check if generate-cached-symfiles on" gdb_test "file $binfile" \ "Reading symbols for shared libraries.*\r\nMapped symbols for ${binfile}.*" \ "t3: load file with cached symfile on" # show info shared library, verify cached symfile is correctly display gdb_test "info sharedlibrary" \ "The DYLD shared library.*1 ${testfile}.*exec.*${binfile}.*${chbinfile}.*3 ${libbinfn}.*${chlibbinfile}.*4.*dylib at $hex.*" \ "t3: check sharedlibrary for 1st time set up cached lib and load files" # set break point at main() gdb_test "break main" \ "Breakpoint 1 at $hex: file.*${testfile}.*line.*" \ "t3: set break point at main" gdb_test "run" \ "Starting program: ${binfile}.*\[\r\n\]+Breakpoint 1, main.*\r\n5.*mylibFunc001.*" \ "t3: run program with set generate-cached-symfiles on" gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir # # test case 4: now load it again to see if cached sym files get used # gdb_test "file $binfile" \ "Reading symbols for shared libraries.*\r\nMapped symbols for $binfile.*" \ "t4: load file again to see if cached sym files get used" gdb_test "info sharedlibrary" \ "The DYLD shared library.*1 ${testfile}.*exec.*${binfile}.*${chbinfile}.*3 ${libbinfn}.*${chlibbinfile}.*4.*dylib at $hex.*" \ "t4: check sharedlibrary info for cached symfile usage" # unload program (binfile) send_gdb "file\n" gdb_expect { -re ".*Discard symbol table from.*${chbinfile}.*y or n.*$" { send_gdb "y\n" gdb_expect { -re ".*No symbol file now.*$gdb_prompt $" { pass "t4: unload program" } -re "$gdb_prompt $" { fail "t4: unload program" } timeout { fail "t4: (timeout) unload program" } } } -re "$gdb_prompt $" { fail "t4: unload program" } timeout { fail "t4: (timeout) unload program" } } # cached symfile library should be removed from shared library info send_gdb "info sharedlibrary\n" gdb_expect { -re ".*1 ${testfile}.*exec.*${binfile}.*${chbinfile}.*3 ${libbinfn}.*${chlibbinfile}.*4.*$gdb_prompt $" { fail "t4: check if cached sym files are discarded from sharedlibrary entry after unloading binfile" } -re ".*The DYLD shared.*3.*$gdb_prompt " { pass "t4: check if cached sym files are discarded from sharedlibrary entry after unloading binfile" } -re "$gdb_prompt $" { fail "t4: check if cached sym files are discarded from sharedlibrary entry after unloading binfile" } timeout { fail "t4: (timeout) check if cached sym files are discarded from sharedlibrary entry after unloading binfile" } } # now load program (binfile) again gdb_test "file $binfile" "Mapped symbols for ${binfile}.*" "t4: loading program 2nd time" # show info shared library after loading program 2nd time # the cached sym file should display gdb_test "info sharedlibrary" \ ".*1 ${testfile}.*exec.*${binfile}.*${chbinfile}.*3 ${libbinfn}.*${chlibbinfile}.*4.*" \ "t4: check sharedlibrary entry to see if sym files get used after loading program 2nd time " gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir # # test case 5: touch library and see if we get message # remote_exec build "sleep 10" remote_exec build "touch ${libbinfile}" verbose "\[DEBUG\] libbinfile=$libbinfile" 1 # verify if touch lib file works set touchFlag [ newer $libbinfile $chlibbinfile ] verbose "\[DEBUG\] touchFlag=$touchFlag" 1 if { $touchFlag } { verbose "*** touch lib succeeded\n" 1 # now load it again; may get messages about out of date cached sym files here verbose "\[DEBUG\]binfile=${binfile}" 1 gdb_test "set verbose on" "" "t5: set verbose on" gdb_test "file $binfile" \ "Mapped.*warning: Cached symbol.*${libbinfn}.*is older.*than library.*ignoring.*Reading symbols from ${libbinfile}.*" \ "t5: load bin file to test if cached bin file out of date" # show info shared library after gdb issue out of date cached sym file send_gdb "info sharedlibrary\n" gdb_expect { -re ".*${chlibbinfile}.*$gdb_prompt $" { fail "t5: check if my cached lib removed from sharedlibrary info" } -re ".*1 ${testfile}.*exec.*${binfile}.*${chbinfile}.*3 ${libbinfn}.*4.*$gdb_prompt $" { pass "t5: check if my cached lib removed from sharedlibrary info" } -re "$gdb_prompt $" { fail "t5: check if my cached lib removed from sharedlibrary info" } timeout { fail "t5: (timeout) check if my cached lib removed from sharedlibrary info" } } gdb_exit } else { verbose "***** touch shared library file failed, tests for out of date will not be executed\n" 1 } # # test case 6: # generate a new ccahed files for later test # remove the old/out of date cached symfile before we set generate-cached-symfiles on # remote_exec build "mv $defcachedir $defcachedir.junk2" if [ file exists $defcachedir ] { verbose "*** Cached sym dir remove faile\n" 1 } else { verbose "*** Cached sym dir remove successed\n" 1 } gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_test "set generate-cached-symfiles on" "" "t6: turn on generate-cached-symfiles" # now load it again gdb_test "file $binfile" "Mapped symbols for ${binfile}.*" "t6: load program to generate the new cached sym files" # to see info sharedlibrary\n" gdb_test "info sharedlibrary" \ ".*1 ${testfile}.*exec.*${binfile}.*${chbinfile}.*3 ${libbinfn}.*${chlibbinfile}.*4.*" \ "t6: check sharedlibrary for new bin file" gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir # # test case 7: touch binary file and see if we get out of date message # remote_exec build "sleep 10" remote_exec build "touch ${binfile}" # verify if touch bin file works set touchFlag [ newer $binfile $chbinfile ] verbose "\[DEBUG\] touchFlag=$touchFlag" 1 if { $touchFlag } { verbose "*** touch binfile succeed\n" 1 # now load it again # may get messages about out of date cached sym bin files here gdb_test "set verbose on" "" "t7: set verbose on" gdb_test "file $binfile" \ "Mapped.*warning: Cached symbol.*${testfile}.*is older.*than library.*${binfile}.*" \ "t7: load bin file to test if cached bin file out of date" # show info shared library after gdb issue out of date cached sym file send_gdb "info sharedlibrary\n" gdb_expect { -re ".*${chbinfile}.*$gdb_prompt $" { fail "t7: check if my cached lib removed from sharedlibrary info" } -re ".*1 ${testfile}.*exec.*${binfile}.*3 ${libbinfn}.*${chlibbinfile}.*4.*$gdb_prompt $" { pass "t7: check if my cached lib removed from sharedlibrary info" } -re "$gdb_prompt $" { fail "t7: check if my cached lib removed from sharedlibrary info" } timeout { fail "t7: (timeout) check if my cached lib removed from sharedlibrary info" } } } else { verbose "*** touch binfile failed, tests for out of date bin cached symfile will not be executed\n" 1 } gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir # # test case 8: test a bug - touching bin file causes malloc/free error message # remote_exec build "mv $defcachedir $defcachedir.junk3" if [ file exists $defcachedir ] { verbose "*** Cached sym dir remove faile\n" 1 } else { verbose "*** Cached sym dir remove successed\n" 1 } gdb_test "set generate-cached-symfiles on" "" "t8: set generate-cached-symfiles on" gdb_test "file $binfile" ".*${binfile}.*" "t8: load bin file" remote_exec build "sleep 10" remote_exec build "touch $binfile" verbose "\[DEBUG\] binfile=$binfile" 1 # verify if touch bin file works set touchFlag [ newer $binfile $chbinfile ] verbose "\[DEBUG\] touchFlag=$touchFlag" 1 if { $touchFlag } { verbose "*** touch bin file succeeded\n" 1 } else { verbose "***** touch bin file failed\n" 1 } gdb_test "b main" "Breakpoint 1 at $hex: file.*line 5\\." "t8: set break point at main" send_gdb "run\n" gdb_expect { -re ".*malloc.*Deallocation of a pointer not malloced.*$gdb_prompt $" { fail "t8: load file to see if it causes malloc/free error message" } -re ".*Breakpoint 1, main.*mylibFunc001.*$gdb_prompt $" { pass "t8: load file to see if it causes malloc/free error message" } -re "$gdb_prompt $" { fail "t8: load file to see if it causes malloc/free error message" } timeout { fail "t8: (timeout) load file to see if it causes malloc/free error message" } } gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir # # start new tests # # crate tmp dir set tmpdir tmpRun set libdir myLib set cachedsympath myCachedSymfiles set mytmp $objdir/$tmpdir set myLib $mytmp/$libdir set myCached $mytmp/$cachedsympath global mytmp global myLib global myCached # create test dir createtmpdir $mytmp $myLib $myCached set mycacheddir ${myCached}/my-gdb-cached-dir verbose "\[DEBUG\] mytmp=$mytmp" 1 verbose "\[DEBUG\] myLib=$myLib" 1 verbose "\[DEBUG\] myCached=$myCached" 1 verbose "\[DEBUG\] mycacheddir=$mycacheddir" 1 remote_exec build "mv $defcachedir $defcachedir.junk4" if [ file exists $defcachedir ] { verbose "*** Cached sym dir remove failed\n" 1 } else { verbose "*** Cached sym dir remove successed\n" 1 } # # test case 9: test cached-symfile-path and sharedlibrary cache-symfile <filename> # set mycacheddir ${myCached}/my-gdb-cached-dir gdb_test "set cached-symfile-dir $mycacheddir" "" "t9: set cached-symfile-dir to my dir" gdb_test "show cached-symfile-path" \ "List of directories to search for cached symbol files is \"\\./gdb-symfile-cache:\\./syms:/usr/libexec/gdb/symfiles\"\\." \ "t9: show cached-symfile-path" gdb_test "set cached-symfile-path $mycacheddir:./gdb-symfile-cache:./syms:/usr/libexec/gdb/symfiles" \ "" \ "t9: append my directory to cached-symfile-path" gdb_test "show cached-symfile-path" \ "List.*is \"$mycacheddir:\\./gdb-symfile-cache:\\./syms:/usr/libexec/gdb/symfiles\"\\." \ "t9: check cached-symfile-path for my directory" gdb_test "set generate-cached-symfiles on" "" "t9: set generate-cached-symfiles on" gdb_test "show generate-cached-symfiles" "If.*default is on\\." "t9: show generate-cached-symfiles" gdb_test "file $binfile" \ "Reading.*\r\nMapped symbols for $binfile.*" \ "t9: load executable program" gdb_test "info sharedlibrary" \ "The DYLD shared library.*1 ${testfile}.*exec.*${binfile}.*${mycacheddir}/${testfile}\\.syms.*2 dyld.*${mycacheddir}/dyld\\.syms.*3.*${mycacheddir}/${libbinfn}.*4.*${mycacheddir}/libSystem.*commpage symbols read.*LC_SEGMENT.__DATA.__commpage.*syms" \ "t9: check sharedlibrary to see if any from my symfile dir" gdb_test "break main" "Breakpoint 1 at $hex:.*line 5\\." "t9: set break point at main" gdb_test "run" \ "Starting program: ${binfile}.*\[\r\n\]+Breakpoint 1, main.*\r\n5.*mylibFunc001.*" \ "t9: run the program" gdb_test "continue" \ "Continuing.*In mylibFunc001.*In mylibFunc002.*Program exited normally\\." \ "t9: continue execution" gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir # # test case 10: test cached-symfile-path and sharedlibrary cache-symfiles <shlibnums> # gdb_test "sharedlibrary cache-symfile $binfile $myLib" \ "" \ "t10: create my sharedlibrary cached sym file in my directory" gdb_test "set cached-symfile-path $myLib:./gdb-symfile-cache:./syms:/usr/libexec/gdb/symfiles" \ "" \ "t10: append my cached-symfile-path to default path" gdb_test "show cached-symfile-path" \ "List.*is \"$myLib:\\./gdb-symfile-cache:\\./syms:/usr/libexec/gdb/symfiles\"\\." \ "t10: show cached-symfile-path" gdb_test "set generate-cached-symfiles on" "" "t10: turn on generate-cached-symfiles" gdb_test "file $binfile" \ "Reading.*\r\nMapped symbols for $binfile.*" \ "t10: load bin file to see if it uses cached sym file" gdb_test "info sharedlibrary" \ "The DYLD shared library.*1 ${testfile}.*exec.*${binfile}.*${myLib}/${testfile}\.syms.*2 dyld.*commpage symbols read.*syms\." \ "t10: check sharedlibrary see if get symfile out my symfile dir" gdb_test "sharedlibrary cache-symfiles 2-3 $myLib" \ "" \ "t10: create sharedlibrary cache-symfiles for libraies 2 and 3" send_gdb "file $binfile\n" gdb_expect { -re "Load new symbol table from \"$binfile\".*y or n.*$" { send_gdb "y\n" gdb_expect { -re "Mapped symbols for $binfile.*$gdb_prompt $" { pass "t10: loading program with new cached sym files" } -re "$gdb_prompt $" { fail "t10: loading program with new cached sym file" } timeout { fail "t10: (timeout) loading program with new cached sym file" } } } -re "$gdb_prompt $" { fail "t10: loading program with new cached sym file" } timeout { fail "t10: (timeout) loading program with new cached sym file" } } gdb_test "info sharedlibrary" \ "The DYLD shared library.*1 ${testfile}.*exec.*${binfile}.*${myLib}/${testfile}\.syms.*2 dyld.*${myLib}/dyld\\.syms.*3.*${myLib}/${libbinfn}\\.syms.*5.*${myLib}/${testfile}\\.syms.*" \ "t10: check sharedlibrary info for new cached sym files" send_gdb "file\n" gdb_expect { -re "No executable.*Discard symbol table from.*${myLib}/${testfile}.*y or n.*" { send_gdb "y\n" gdb_expect { -re "No symbol file now.*$gdb_prompt $" { pass "t10: unload file to discard sym tables" } -re "$gdb_prompt $" { fail "t10: unload file to discard sym tables" } timeout { fail "t10: (timeout) unload file to discard sym tables" } } } -re "$gdb_prompt $" { fail "t10: unload file to discard sym tables" } timeout { fail "t10: (timeout) unload file to discard sym tables" } } gdb_test "info sharedlibrary" \ "The DYLD shared library.*1 dyld.*2 ${libbinfn}.*3 libSystem.B.dylib.*4 -.*" \ "t10: check sharedlibrary info after unload executable file" remote_exec build "rm -r $defcachedir" remote_exec build "rm -r $defcachedir.junk" remote_exec build "rm -r $defcachedir.junk1" remote_exec build "rm -r $defcachedir.junk2" remote_exec build "rm -r $defcachedir.junk3" remote_exec build "rm -r $defcachedir.junk4" if [ file exists $defcachedir ] { verbose "*** Cached sym dir remove failed\n" 1 } gdb_exit return 0