-# Copyright 2012 Free Software Foundation, Inc.
+# Copyright 2012-2019 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
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+load_lib valgrind.exp
+
if [is_remote target] {
# The test always runs locally.
return 0
}
-set test valgrind-infcall
-set srcfile $test.c
-set executable $test
-set binfile ${objdir}/${subdir}/${executable}
-if {[build_executable $test.exp $executable $srcfile {debug}] == -1} {
+standard_testfile .c
+if {[build_executable $testfile.exp $testfile $srcfile {debug}] == -1} {
return -1
}
-set test "spawn valgrind"
-set cmd "valgrind --vgdb-error=0 $binfile"
-set res [remote_spawn host $cmd];
-if { $res < 0 || $res == "" } {
- verbose -log "Spawning $cmd failed."
- unsupported $test
+if { [vgdb_start] == -1 } {
return -1
}
-pass $test
-# Declare GDB now as running.
-set gdb_spawn_id -1
-
-# GDB started by vgdb 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
- }
- -re "valgrind: Bad option.*--vgdb-error=0" {
- # valgrind is not >= 3.7.0.
- unsupported $test
- return -1
- }
-}
-
-set test "vgdb prompt"
-# The trailing '.' differs for different memcheck versions.
-gdb_test_multiple "" $test {
- -re " (target remote | \[^\r\n\]*/vgdb \[^\r\n\]*)\r\n" {
- set vgdbcmd $expect_out(1,string)
- pass $test
- }
-}
-
-# Do not kill valgrind.
-unset gdb_spawn_id
-set board [host_info name]
-unset_board_info fileid
-
-clean_restart $executable
-
-gdb_test "$vgdbcmd" " in \\.?_start .*" "target remote for vgdb"
-
-gdb_test "monitor v.set gdb_output" "valgrind output will go to gdb.*"
set continue_count 1
-while 1 {
+set loop 1
+while {$loop && $continue_count < 100} {
set test "continue #$continue_count"
gdb_test_multiple "continue" "" {
-re "Invalid free\\(\\).*: main .*\r\n$gdb_prompt $" {
pass $test
- break
+ set loop 0
}
-re "Remote connection closed.*\r\n$gdb_prompt $" {
fail "$test (remote connection closed)"
+ # Only if valgrind got stuck.
+ kill_wait_spawned_process $valgrind_spawn_id
+ return -1
+ }
+ -re "The program is not being run\\.\r\n$gdb_prompt $" {
+ fail "$test (valgrind vgdb has terminated)"
+ # Only if valgrind got stuck.
+ kill_wait_spawned_process $valgrind_spawn_id
return -1
}
-re "\r\n$gdb_prompt $" {
pass $test
}
}
+
+vgdb_stop