| # 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 |
| |