# Copyright 2002 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. # This file was written by Jim Ingham <jingham@apple.com> # This program loads, unloads & reloads a bundle. We set a breakpoint in # a function in a dependent bundle to the loaded one. We also load a dummy # bundle between the load & unload to force the second load to a different # location. if $tracelevel then { strace $tracelevel } set prms_id 0 set bug_id 0 set bindir [file join ${objdir} ${subdir}] set reallib "libreal" set realbinfile [file join $bindir $reallib.dylib] set loaded_bundle loaded set loaded_binfile [file join $bindir $loaded_bundle.bundle] set dummy_bundle dummy set dummy_binfile [file join $bindir $dummy_bundle.bundle] set testfile "loader" set srcfile ${testfile}.c set binfile [file join $bindir $testfile] # Make libreal.dylib set additional_flags "additional_flags=-dynamiclib" if { [gdb_compile "${srcdir}/${subdir}/real.c" "$realbinfile" executable [list debug $additional_flags]] != "" } { gdb_suppress_entire_file "Testcase real compile failed, so all tests in this file will automatically fail." } # Make loaded set additional_flags "additional_flags=-bundle -L$bindir -lreal" if { [gdb_compile "${srcdir}/${subdir}/loaded.c" "$loaded_binfile" executable [list debug $additional_flags]] != "" } { gdb_suppress_entire_file "Testcase loaded compile failed, so all tests in this file will automatically fail." } # Make dummy set additional_flags "additional_flags=-dynamiclib" if { [gdb_compile "${srcdir}/${subdir}/dummy.c" "$dummy_binfile" executable [list debug $additional_flags]] != "" } { gdb_suppress_entire_file "Testcase dummy bundle compile failed, so all tests in this file will automatically fail." } # Make dummy if { [gdb_compile "${srcdir}/${subdir}/loader.c" "$binfile" executable debug] != "" } { gdb_suppress_entire_file "Testcase dummy bundle compile failed, so all tests in this file will automatically fail." } load_lib mi-support.exp set MIFLAGS "-i=mi1" gdb_exit if [mi_gdb_start] { continue } mi_delete_breakpoints mi_gdb_reinitialize_dir $srcdir/$subdir mi_gdb_load ${binfile} mi_run_to_main send_gdb "200-break-insert -s libreal.dylib -f real_function\n" gdb_expect { -re "200\\^done,bkpt=\{number=\"2\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"<PENDING>\",pending=\"real_function\",times=\"0\"\}\[\r\n\]+$mi_gdb_prompt$" { pass "break-insert blocky operation" } -re ".*$mi_gdb_prompt$" { fail "break-insert blocky operation" } timeout { fail "(timeout) break-insert blocky operation" } } send_gdb "200-break-insert -s dummy.bundle -f dummy_function\n" gdb_expect { -re "200\\^done,bkpt=\{number=\"3\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"<PENDING>\",pending=\"dummy_function\",times=\"0\"\}\[\r\n\]+$mi_gdb_prompt$" { pass "break-insert blocky operation" } -re ".*$mi_gdb_prompt$" { fail "break-insert blocky operation" } timeout { fail "(timeout) break-insert blocky operation" } } send_gdb "210-gdb-set sharedlibrary load-rules dyld .* extern\n" gdb_expect { -re "210\\^done\[\r\n\]+$mi_gdb_prompt$" { pass "setting sharedlibrary load rules to extern." } timeout { fail "(timeout) setting sharedlibrary load rules to extern." } } send_gdb "211-gdb-set auto-raise-load-levels 1\n" gdb_expect { -re "211\\^done\[\r\n\]+$mi_gdb_prompt$" { pass "setting auto-raise load levels." } timeout { fail "(timeout) setting auto-raise load levels." } } set libs_loaded {.*\r\n=shlibs-added,shlib-info=\[num="[0-9]+",name="loaded.bundle",.*\].*\r\n=shlibs-added,shlib-info=\[num="[0-9]+",name="libreal.dylib".*\].*\r\n.*} set libs_unloaded {.*\r\n=shlibs-removed,shlib-info=\[num="[0-9]+",name="loaded.bundle",.*\].*\r\n=shlibs-removed,shlib-info=\[num="[0-9]+",name="libreal.dylib".*\].*\r\n.*} set varobj_deleted {=var-deleted,var="loaded_varobj".*\r\n.*} mi_continue_to 2 real_function ".*" real.c "11" "Run to real function first time" $libs_loaded # Now make a variable object that relies on types from the loaded.bundle. # Then when we get unloaded, we can try to update & evaluate the varobj, and # if we haven't figured out that this varobj relies on the types that got unloaded, # we'll just crash. mi_gdb_test {-var-create loaded_varobj * global_struct} \ {name="loaded_varobj",numchild="2",type="struct real_struct",.*} \ {Create varobj relying on types in loaded.bundle} mi_gdb_test {-var-list-children --all-values loaded_varobj} \ {numchild="2",children=\[child=\{.*value="0".*\},child=\{.*value="0".*\}\]} \ {List children of loaded_varobj} mi_continue_to 3 dummy_function ".*" dummy.c "4" "Run to dummy function" $libs_unloaded$varobj_deleted mi_gdb_test {-var-update loaded_varobj} {.*msg="Variable object not found".*} {Try to update loaded_varobj, should already be gone.} mi_continue_to 2 real_function ".*" real.c "11" "Run to real function second time" $libs_loaded send_gdb "210-break-disable 3\n" gdb_expect { -re "210\\^done\[\r\n\]+$mi_gdb_prompt$" { pass "Disable breakpoint at dummy_function" } timeout { fail "(timeout) disable breakpoint at dummy_function" } } send_gdb "220-exec-run\n" gdb_expect { -re "220\\*stopped,reason=\"breakpoint-hit\",commands=\"no\",times=\"1\",bkptno=\"1\",thread-id=\"$decimal\"\[\r\n\]+$mi_gdb_prompt$" { pass "Rerunning." } timeout { fail "(timeout) rerunning" } } mi_continue_to 2 real_function ".*" real.c "11" "Rerun to real function first time" $libs_loaded mi_continue_to 2 real_function ".*" real.c "11" "Rerun to real function second time" $libs_unloaded$libs_loaded