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 cmd "valgrind --vgdb-error=0 $binfile"
set res [remote_spawn host $cmd]
if { $res < 0 || $res == "" } {
verbose -log "Spawning $cmd failed."
# Declare GDB now as running.
set gdb_spawn_id $res
-# 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.
+# 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 "valgrind: Unknown option: --db-attach=yes" {
- unsupported $test
- return -1
- }
-re "Memcheck, a memory error detector\\.?\r\n" {
pass $test
}
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.
+set valgrind_spawn_id [board_info host fileid]
+unset gdb_spawn_id
+set board [host_info name]
+unset_board_info fileid
+
+clean_restart $testfile
+
+# Make sure we're disconnected, in case we're testing with the
+# native-extended-gdbserver board, where gdb_start/gdb_load spawn
+# gdbserver and connect to it.
+gdb_test "disconnect" ".*"
+
+gdb_test "$vgdbcmd" " in \\.?_start .*" "target remote for vgdb"
+
+gdb_test "monitor v.set gdb_output" "valgrind output will go to gdb.*"
+
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"
+set test "continue"
+gdb_test_multiple "continue" $test {
+ -re "Invalid free\\(\\).*: main \\(${srcfile}:$double_free\\)\r\n.*$gdb_prompt $" {
+ pass $test
+ }
+ -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 "---- Attach to debugger \\? --- \[^\r\n\]* ---- " {
- send_gdb "n\r"
- exp_continue
+ -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 (false warning)"
}
}
-gdb_test "" ".*" "eat first prompt"
-
# Initialization from default_gdb_start.
gdb_test_no_output "set height 0"
gdb_test_no_output "set width 0"
# 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"
+
+# Only if valgrind got stuck.
+kill_wait_spawned_process $valgrind_spawn_id