This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] Fix for gdb.server/non-existing-program.exp test case
- From: "Carl E. Love" <cel at us dot ibm dot com>
- To: Ulrich Weigand <uweigand at de dot ibm dot com>
- Cc: Andreas Arnez <arnez at linux dot vnet dot ibm dot com>, gdb-patches at sourceware dot org, Edjunior Barbosa Machado <emachado at linux dot vnet dot ibm dot com>, Ulrich Weigand <Ulrich dot Weigand at de dot ibm dot com>
- Date: Tue, 13 Sep 2016 08:25:07 -0700
- Subject: Re: [PATCH] Fix for gdb.server/non-existing-program.exp test case
- Authentication-results: sourceware.org; auth=none
- References: <20160913132630.92A081161D1@oc8523832656.ibm.com>
On Tue, 2016-09-13 at 15:26 +0200, Ulrich Weigand wrote:
> Carl Love wrote:
>
> > 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.
>
> The patch makes sense to me, however there seem to be
> some formatting issues (mail client problems?):
>
> > + /* The last_status.kind was set by the call to
> > ptrace(PTRACE_TRACEME, ...).
> > + The function linux_wait() has also been called. At this point,
> > the
> > + target process, if it exits, is stopped. Depending on the
> > architecture,
> > + the function target_post_create_inferior () may make additional
> > ptrace ()
> > + calls that will fail if the target has already exited.
> > + */
>
> Please make sure this is properly formatted (and does not exceed
> the 80 characters per line limit).
>
> Also, the comment seems a bit too specific; this file is also used
> for targets other than Linux that may not use ptrace specifically.
> I'd word the comment a bit more generically, along the lines of
> "Do not call target_post_create_inferior if the process has already
> exited, since the target implementation of that routine may rely on
> the process being live."
I fixed up the comment per your suggestion. Not sure what happened with
the formatting. See if this looks better.
Carl Love
---------------------------------------------------------------------------
Fix for gdb.server/non-existing-program.exp test case
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/server.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 6fbd61d..908be47 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -290,11 +290,16 @@ 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, ...).
+ The function linux_wait() has also been called. 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;
}
--
2.4.11