Fix for gdb.server/non-existing-program.exp test case
authorCarl E. Love <carll@oc4738070240.ibm.com>
Tue, 13 Sep 2016 16:41:54 +0000 (09:41 -0700)
committerCarl E. Love <carll@oc4738070240.ibm.com>
Tue, 13 Sep 2016 16:46:18 +0000 (09:46 -0700)
The test checks to make sure GDB exits cleanly if there is
no valid target binary.  Currently, ppc and S390 fail on this
test.  The function target_post_create_inferior () calls
linux_post_create_inferior () which calls the architecture
specific functions s390_arch_setup () and ppc_arch_setup ()
which make ptrace calls to access the architecture specific
registers.  These ptrace calls fail because the process does
not exist causing GDB to exit on error.

This patch checks to see if the initial ptrace (PTRACE_TRACEME, ...)
call returned a status of TARGET_WAITKIND_EXITED indicating the
target has already exited.  If the target has exited, then the
target_post_create_inferior () is not called since there is no
inferior to be setup.  The test to see if the initial ptrace
call succeeded is done after the ptrace (PTRACE_TRACEME, ...)
call and the wait for the inferior process to stop, assuming
it exists, has occurred.

The patch has been tested on X86 64-bit, ppc64 and s390.  If
fixes the test failures on ppc64 and s390.  The test does not
fail on X86 64-bit.  The patch does not introduce any additional
regression failures on any of these three platforms.

gdbserver/ChangeLog

2016-09-06  Carl Love  <cel@us.ibm.com>

* server.c (start_inferior):  Do not call
function target_post_create_inferior () if the
inferior process has already exited.

gdb/gdbserver/ChangeLog
gdb/gdbserver/server.c

index 5e9e4cb43a5596ab9074993da161ad845367a8ca..4b9bc7eb65b31fc55d6a13ac7283af857619aeef 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-06  Carl Love  <cel@us.ibm.com>
+
+       * server.c (start_inferior):  Do not call
+       function target_post_create_inferior () if the
+       inferior process has already exited.
+
 2016-09-05  Pedro Alves  <palves@redhat.com>
 
        * Makefile.in (COMPILER, COMPILER_CFLAGS): Remove.
index 9c06443e25c387351e4e08fccf8ad6d3ceac662d..96e3a18cb9c49daf98bbd9a25106e5f0358a2a9b 100644 (file)
@@ -285,11 +285,15 @@ start_inferior (char **argv)
      (assuming success).  */
   last_ptid = mywait (pid_to_ptid (signal_pid), &last_status, 0, 0);
 
-  target_post_create_inferior ();
-
+  /* The last_status.kind was set by the call to ptrace(PTRACE_TRACEME, ...).
+     At this point, the target process, if it exits, is stopped.  Do not call
+     the function target_post_create_inferior if the process has already
+     exited, as the target implementation of the routine may rely on the
+     process being live. */
   if (last_status.kind != TARGET_WAITKIND_EXITED
       && last_status.kind != TARGET_WAITKIND_SIGNALLED)
     {
+      target_post_create_inferior ();
       current_thread->last_resume_kind = resume_stop;
       current_thread->last_status = last_status;
     }