nick.exp   [plain text]


# Copyright 2005 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.  

# Test the environment of someone working on dyld.  Which is
#
# 1. The dyld they're working on is not installed as /usr/lib/dyld -- it's no
#    fun to trash your system while you're working on a bug.
# 2. dyld was built as "dyld" by Xcode, so when Xcode sets breakpoints
#    it'll specify a shlib for those breakpoints of "dyld" and they'll never
#    hit when the actual dynamic loader is "dyld-tst".  So /tmp/dyld-tst becomes
#    a symlink to the dyld in the built directory.

# i.e. at runtime we have
#
#  BUILDDIR/test-program  (some random program we don't care about)
#  BUILDDIR/dyld          (the dyld we're debugging)
#  /tmp/dyld-tst -> BUILDDIR/dyld
#
#  The test-program has /usr/lib/dyld listed as its dynamic linker, so we
#  need to post-process BUILDDIR/test-program to change the string 
#  "/usr/lib/dyld" to "/tmp/dyld-tst" so it will use the symlink to 
#  BUILDDIR/dyld which we want to debug.

if $tracelevel then {
        strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile "nick"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/$srcfile" "${binfile}" executable {debug}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

remote_exec build "perl -pi -e s#/usr/lib/dyld#/tmp/dyld-tst# $binfile"
remote_exec build "rm -f ${objdir}/${subdir}/dyld"
remote_exec build "cp /usr/lib/dyld ${objdir}/${subdir}/dyld"
remote_exec build "rm -f /tmp/dyld-tst"
remote_exec build "ln -s ${objdir}/${subdir}/dyld /tmp/dyld-tst"

set dyld_before_event __dyld__ZN4dyld24initializeMainExecutableEv

# Start with a fresh gdb

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

gdb_test "break -shlib dyld $dyld_before_event" "Breakpoint 1 at $hex.*" "setting breakpoint at dyld initializeMainExecutable, shlib-restricted"
gdb_test "break main" "Breakpoint 2 at $hex: file.*" "setting breakpoint on main"

gdb_test "run" "Starting program: $binfile *\r\n\.*Breakpoint 1, .*$dyld_before_event.*" "stopped in dyld"
gdb_test "continue" "Continuing\\..*Breakpoint 2, main.*" "stopped at main" 

gdb_test "info shared" "dyld.*dyld Y Y.*nick.*exec Y Y.*libSystem.B.dylib.*dyld Y Y.*" "gdb is getting load notifications"

send_gdb "info shared\n"
gdb_expect {
  -re ".*dyld-tst.*$gdb_prompt $" {
     fail "dyld-tst should not be in info shared output"
  }
  -re ".*libSystem.B.dylib.*$gdb_prompt $" {
     pass "dyld-tst should not be in info shared output"
  }
  -re "$gdb_prompt $" {
      fail "dyld-tst should not be in info shared output"
  }
  timeout {
      fail "(timeout) dyld-tst should not be in info shared output"
  }
}

gdb_test "info shared" ".*${objdir}/${subdir}/dyld.*" "copy of dyld should be in info shared output"

gdb_test "maint info br" ".*-$decimal *shlib events *keep y *$hex.*gdb_image_notifier.*" "dylib notification internal breakpoint was set"


gdb_exit
return 0