+2015-09-11 Don Breazeal <donb@codesourcery.com>
+
+ * gdb.base/foll-exec.c: Add copyright header. Fix
+ formatting issues.
+ * gdb.base/foll-exec.exp (zap_session): Delete proc.
+ (do_exec_tests): Use clean_restart in place of zap_session,
+ and for test initialization. Fix formatting issues. Use
+ fail in place of perror.
+ * gdb.base/pie-execl.exp (main): Use 'inferior_spawn_id' in
+ an expect statement to match an expression with output from
+ the program under debug.
+ * gdb.threads/non-ldr-exc-1.exp (do_test, main): Add
+ non-stop tests and use save_vars to enable non-stop in GDBFLAGS.
+ * gdb.threads/non-ldr-exc-2.exp: Likewise.
+ * gdb.threads/non-ldr-exc-3.exp: Likewise.
+ * gdb.threads/non-ldr-exc-4.exp: Likewise.
+
2015-09-09 Doug Evans <dje@google.com>
* gdb.python/py-prettyprint.exp: Check result of run_lang_tests.
+/* This test program is part of GDB, the GNU debugger.
+
+ Copyright 1997-2015 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/>. */
+
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
-
-int global_i = 100;
+int global_i = 100;
int main (void)
{
- int local_j = global_i+1;
- int local_k = local_j+1;
+ int local_j = global_i + 1;
+ int local_k = local_j + 1;
printf ("foll-exec is about to execlp(execd-prog)...\n");
execlp (BASEDIR "/execd-prog",
- BASEDIR "/execd-prog",
- "execlp arg1 from foll-exec",
- (char *)0);
+ BASEDIR "/execd-prog",
+ "execlp arg1 from foll-exec",
+ (char *) 0);
printf ("foll-exec is about to execl(execd-prog)...\n");
execl (BASEDIR "/execd-prog", /* tbreak-execl */
- BASEDIR "/execd-prog",
- "execl arg1 from foll-exec",
- "execl arg2 from foll-exec",
- (char *)0);
+ BASEDIR "/execd-prog",
+ "execl arg1 from foll-exec",
+ "execl arg2 from foll-exec",
+ (char *) 0);
{
static char * argv[] = {
- (char *)BASEDIR "/execd-prog",
- (char *)"execv arg1 from foll-exec",
- (char *)0};
+ (char *) BASEDIR "/execd-prog",
+ (char *) "execv arg1 from foll-exec",
+ (char *) 0};
printf ("foll-exec is about to execv(execd-prog)...\n");
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# This is a test of gdb's ability to follow a process through a
+# Unix exec() system call.
+
if { [is_remote target] || ![isnative] } then {
continue
}
return -1
}
-proc zap_session {} {
- global gdb_prompt
- global binfile
-
- send_gdb "kill\n"
- gdb_expect {
- -re ".*Kill the program being debugged.*y or n. $" {
- gdb_test_no_output "y" ""
- send_gdb "file $binfile\n"
- gdb_expect {
- -re ".*Load new symbol table from.*y or n. $" {
- send_gdb "y\n"
- gdb_expect {
- -re "Reading symbols from.*$gdb_prompt $" {}
- timeout { fail "loading symbols (timeout)"; return }
- }
- }
- -re ".*gdb_prompt $" {}
- timeout { fail "loading symbols (timeout)"; return }
- }
- }
- -re ".*$gdb_prompt $" {}
- timeout { fail "killing inferior (timeout)" ; return }
- }
-}
-
proc do_exec_tests {} {
+ global binfile srcfile srcfile2 testfile testfile2
global gdb_prompt
- global binfile
- global srcfile
- global srcfile2
- global testfile
- global testfile2
# Start the program running, and stop at main.
#
if ![runto_main] then {
- perror "Couldn't run ${testfile}"
+ fail "Couldn't run ${testfile}"
return
}
return
}
- zap_session
+ clean_restart $binfile
# Start the program running, and stop at main.
#
if ![runto_main] then {
- perror "Couldn't run ${testfile}"
+ fail "Couldn't run ${testfile}"
return
}
# Explicitly kill this program, or a subsequent rerun actually runs
# the exec'd program, not the original program...
- zap_session
+ clean_restart $binfile
# Start the program running, and stop at main.
#
if ![runto_main] then {
- perror "Couldn't run ${testfile} (2nd try)"
+ fail "Couldn't run ${testfile} (2nd try)"
return
}
# Explicitly kill this program, or a subsequent rerun actually runs
# the exec'd program, not the original program...
- zap_session
+ clean_restart $binfile
# Start the program running, and stop at main.
#
if ![runto_main] then {
- perror "Couldn't run ${testfile} (3rd try)"
+ fail "Couldn't run ${testfile} (3rd try)"
return
}
# Explicitly kill this program, or a subsequent rerun actually runs
# the exec'd program, not the original program...
- zap_session
+ clean_restart $binfile
# Start the program running, and stop at main.
#
if ![runto_main] then {
- perror "Couldn't run ${testfile} (4th try)"
+ fail "Couldn't run ${testfile} (4th try)"
return
}
# Explicitly kill this program, or a subsequent rerun actually runs
# the exec'd program, not the original program...
- zap_session
+ clean_restart $binfile
# Start the program running, and stop at main.
#
if ![runto_main] then {
- perror "Couldn't run ${testfile} (5th try)"
+ fail "Couldn't run ${testfile} (5th try)"
return
}
# Start with a fresh gdb
gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
+clean_restart $binfile
-# This is a test of gdb's ability to follow a process through a
-# Unix exec() system call.
-#
do_exec_tests
return 0
check_vfork_catchpoints
}
-# There is no support for exec events in the RSP yet.
-if { ![gdb_is_target_remote] } {
- # Follow parent and follow child vfork tests with a child that execs.
- with_test_prefix "exec" {
- # These are tests of gdb's ability to follow the parent of a Unix
- # vfork system call. The child will subsequently call a variant
- # of the Unix exec system call.
- do_vfork_and_follow_parent_tests
-
- # These are tests of gdb's ability to follow the child of a Unix
- # vfork system call. The child will subsequently call a variant
- # of a Unix exec system call.
- #
- do_vfork_and_follow_child_tests_exec
- }
-} else {
- unsupported "vfork with exec: exec events not supported for remote"
+# Follow parent and follow child vfork tests with a child that execs.
+with_test_prefix "exec" {
+ # These are tests of gdb's ability to follow the parent of a Unix
+ # vfork system call. The child will subsequently call a variant
+ # of the Unix exec system call.
+ do_vfork_and_follow_parent_tests
+
+ # These are tests of gdb's ability to follow the child of a Unix
+ # vfork system call. The child will subsequently call a variant
+ # of a Unix exec system call.
+ #
+ do_vfork_and_follow_child_tests_exec
}
# Switch to test the case of the child exiting. We can't use
# The problem was due to amd64_skip_prologue attempting to access inferior
# memory before the PIE (Position Independent Executable) gets relocated.
+global inferior_spawn_id
+global gdb_spawn_id
+
if ![istarget *-linux*] {
continue
}
verbose -log "addr1 is $addr1"
set test "continue"
+set matches_found 0
gdb_test_multiple $test $test {
-re "Error in re-setting breakpoint" {
fail $test
-re "Cannot access memory" {
fail $test
}
- -re "pie-execl: re-exec.*executing new program.*\r\nBreakpoint \[0-9\]+,\[^\r\n\]* pie_execl_marker .*\r\n$gdb_prompt $" {
- pass $test
+ -i "$inferior_spawn_id" -re "pie-execl: re-exec" {
+ # output from inferior
+ incr matches_found
+ if { $matches_found == 2 } {
+ pass $test
+ } else {
+ exp_continue
+ }
+ }
+ -i "$gdb_spawn_id"
+ -re "executing new program.*\r\nBreakpoint \[0-9\]+,\[^\r\n\]* pie_execl_marker .*\r\n$gdb_prompt $" {
+ # output from gdb
+ incr matches_found
+ if { $matches_found == 2 } {
+ pass $test
+ } else {
+ exp_continue
+ }
}
}
return -1
}
-proc do_test { lock_sched } {
- with_test_prefix "lock-sched$lock_sched" {
+proc do_test { lock_sched nonstop } {
+ with_test_prefix "lock-sched=$lock_sched,non-stop=$nonstop" {
global executable
- clean_restart ${executable}
+ save_vars { GDBFLAGS } {
+ append GDBFLAGS " -ex \"set non-stop $nonstop\""
+ clean_restart ${executable}
+ }
if ![runto_main] {
return -1
gdb_test_no_output "set scheduler-locking on"
}
+ if { $nonstop == "on" } {
+ gdb_test "thread 2" "Switching.*"
+ }
+
gdb_test "continue" \
".*is executing new program.*Breakpoint 1, main.* at .*" \
"continue over exec"
}
}
-do_test 0
-do_test 1
+foreach nonstop {"on" "off"} {
+ foreach schedlock {"on" "off"} {
+ if {$schedlock == "on" && $nonstop == "on"} {
+ # Schedule locking has no effect in nonstop mode.
+ continue
+ }
+ do_test $schedlock $nonstop
+ }
+}
return -1
}
-proc do_test { lock_sched } {
- with_test_prefix "lock-sched$lock_sched" {
+proc do_test { lock_sched nonstop } {
+ with_test_prefix "lock-sched=$lock_sched,non-stop=$nonstop" {
global executable
- clean_restart ${executable}
+ save_vars { GDBFLAGS } {
+ append GDBFLAGS " -ex \"set non-stop $nonstop\""
+ clean_restart ${executable}
+ }
if ![runto_main] {
return -1
gdb_breakpoint [gdb_get_line_number "break-here"]
gdb_continue_to_breakpoint "break-here" ".* break-here .*"
+ if { $nonstop == "on" } {
+ gdb_test "thread 2" "Switching.*"
+ }
+
gdb_test "info threads" \
"\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*" \
"single thread left"
}
}
-do_test 0
-do_test 1
+foreach nonstop {"on" "off"} {
+ foreach schedlock {"on" "off"} {
+ if {$schedlock == "on" && $nonstop == "on"} {
+ # Schedule locking has no effect in nonstop mode.
+ continue
+ }
+ do_test $schedlock $nonstop
+ }
+}
return -1
}
-proc do_test { lock_sched } {
- with_test_prefix "lock-sched$lock_sched" {
+proc do_test { lock_sched nonstop } {
+ with_test_prefix "lock-sched=$lock_sched,non-stop=$nonstop" {
global executable
- clean_restart ${executable}
+ save_vars { GDBFLAGS } {
+ append GDBFLAGS " -ex \"set non-stop $nonstop\""
+ clean_restart ${executable}
+ }
if ![runto_main] {
return -1
}
gdb_breakpoint [gdb_get_line_number "break-here"]
- gdb_continue_to_breakpoint "break-here" ".* break-here .*"
+ gdb_test_multiple "continue" "continue to breakpoint" {
+ -re ".*Breakpoint.*break-here.*" {
+ pass "continue to breakpoint"
+ }
+ }
# Also test with sched-lock to make sure we can follow the
# non-leader thread execing even though the main thread wasn't
gdb_test_no_output "set scheduler-locking on"
}
+ if { $nonstop == "on" } {
+ gdb_test "thread 2" "Switching.*"
+ }
+
gdb_test "continue" \
".*is executing new program.*Breakpoint 1, main.* at .*" \
"continue over exec"
}
}
-do_test 0
-do_test 1
+foreach nonstop {"on" "off"} {
+ foreach schedlock {"on" "off"} {
+ if {$schedlock == "on" && $nonstop == "on"} {
+ # Schedule locking has no effect in nonstop mode.
+ continue
+ }
+ do_test $schedlock $nonstop
+ }
+}
return -1
}
-proc do_test { lock_sched } {
- with_test_prefix "lock-sched$lock_sched" {
+proc do_test { lock_sched nonstop } {
+ with_test_prefix "lock-sched=$lock_sched,non-stop=$nonstop" {
global executable
- clean_restart ${executable}
+ save_vars { GDBFLAGS } {
+ append GDBFLAGS " -ex \"set non-stop $nonstop\""
+ clean_restart ${executable}
+ }
if ![runto_main] {
return -1
gdb_test_no_output "set scheduler-locking on"
}
+ if { $nonstop == "on" } {
+ gdb_test "thread 2" "Switching.*"
+ }
+
gdb_test "continue" \
".*is executing new program.*Breakpoint 1, main.* at .*" \
"continue over exec"
}
}
-do_test 0
-do_test 1
+foreach nonstop {"on" "off"} {
+ foreach schedlock {"on" "off"} {
+ if {$schedlock == "on" && $nonstop == "on"} {
+ # Schedule locking has no effect in nonstop mode.
+ continue
+ }
+ do_test $schedlock $nonstop
+ }
+}