# Copyright 2009-2013 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 . if [is_remote target] { # The test always runs locally. return 0 } set test valgrind-db-attach set srcfile $test.c set executable $test set binfile ${objdir}/${subdir}/${executable} if {[build_executable $test.exp $executable $srcfile {debug}] == -1} { return -1 } gdb_exit # remote_spawn breaks the command on each whitespace despite possible quoting. # Use backslash-escaped whitespace there instead: set db_command "--db-command=$GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts] %f %p" regsub -all " " $db_command "\\ " db_command set test "spawn valgrind" set cmd "valgrind --db-attach=yes $db_command $binfile" set res [remote_spawn host $cmd] if { $res < 0 || $res == "" } { verbose -log "Spawning $cmd failed." unsupported $test return -1 } pass $test # Declare GDB now as running. set gdb_spawn_id -1 # GDB spawned by `valgrind --db-attach=yes' stops already after the startup is # executed, like with non-extended gdbserver. It is also not correct to # run/attach the inferior. set use_gdb_stub 1 set test "valgrind started" # The trailing '.' differs for different memcheck versions. gdb_test_multiple "" $test { -re "Memcheck, a memory error detector\\.?\r\n" { pass $test } -re "valgrind: failed to start tool 'memcheck' for platform '.*': No such file or directory" { unsupported $test return -1 } -re "valgrind: wrong ELF executable class" { unsupported $test return -1 } -re "command not found" { # The spawn succeeded, but then valgrind was not found - e.g. if # we spawned SSH to a remote system. unsupported $test return -1 } } set double_free [gdb_get_line_number "double-free"] set test "attach to debugger" gdb_test_multiple "" $test { -re "Invalid free\\(\\).*: main \\(${srcfile}:$double_free\\)\r\n.*---- Attach to debugger \\? --- \[^\r\n\]* ---- " { send_gdb "y\r" } -re "---- Attach to debugger \\? --- \[^\r\n\]* ---- " { send_gdb "n\r" exp_continue } } gdb_test "" ".*" "eat first prompt" # Initialization from default_gdb_start. gdb_test_no_output "set height 0" gdb_test_no_output "set width 0" gdb_test "bt" "in main \\(.*\\) at .*${srcfile}:$double_free" # Explicitly kill the program so it doesn't dump core when we quit->detach. gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y"