# This testcase is part of GDB, the GNU debugger.

# Copyright 2007, 2009-2012 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 3 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, see <http://www.gnu.org/licenses/>.

# Test attaching to already-running programs using extended-remote.

load_lib gdbserver-support.exp

set testfile "ext-attach"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if { [skip_gdbserver_tests] } {
    return 0
}

# We need to use TCL's exec to get the pid.
if [is_remote target] then {
    return 0
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested ext-attach.exp
    return -1
}

gdb_exit
gdb_start
gdb_load $binfile
gdb_reinitialize_dir $srcdir/$subdir

# Make sure we're disconnected, in case we're testing with an
# extended-remote board, therefore already connected.
gdb_test "disconnect" ".*"

set target_exec [gdbserver_download_current_prog]
gdbserver_start_extended

gdb_test_no_output "set remote exec-file $target_exec" "set remote exec-file"

# Start the program running and then wait for a bit, to be sure
# that it can be attached to.
set testpid [eval exec $binfile &]
exec sleep 2
if { [istarget "*-*-cygwin*"] } {
    # testpid is the Cygwin PID, GDB uses the Windows PID, which might be
    # different due to the way fork/exec works.
    set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
}

gdb_test "attach $testpid" \
    "Attaching to program: .*, process $testpid.*(in|at).*" \
    "attach to remote program 1"
gdb_test "backtrace" ".*main.*" "backtrace 1"

gdb_test "detach" "Detaching from program.*process.*"
gdb_test "backtrace" "No stack\\." "backtrace with no program"

gdb_test "attach $testpid" \
    "Attaching to program: .*, process $testpid.*(in|at).*" \
    "attach to remote program 2"
gdb_test "backtrace" ".*main.*" "backtrace 2"

gdb_test "kill" "" "kill" "Kill the program being debugged.*" "y"
gdb_test_no_output "monitor exit"
