Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Apr 2010 14:37:36 -0700
From:      Garrett Cooper <yanefbsd@gmail.com>
To:        Gunnar Hinriksson <tomtinn@gmail.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Ptrace segfault
Message-ID:  <p2i7d6fde3d1004291437y9b789015ybf8153b41e034d9f@mail.gmail.com>
In-Reply-To: <q2vcbb19c781004291206sc54fdb6ag53c3a763ad364e8e@mail.gmail.com>
References:  <q2vcbb19c781004291206sc54fdb6ag53c3a763ad364e8e@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Apr 29, 2010 at 12:06 PM, Gunnar Hinriksson <tomtinn@gmail.com> wro=
te:
> Hello
>
> Im having a little problem using ptrace on my system.
> If I use ptrace to attach to another process the child process
> segfaults once I detach.
> For example using this simple program.
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/types.h>
> #include <sys/ptrace.h>
> #include <sys/wait.h>
>
> int main(int argc, char *argv[])
> {
> =A0 =A0 =A0 =A0int pid =3D atoi(argv[1]);
> =A0 =A0 =A0 =A0ptrace(PT_ATTACH, pid, 0, 0);
> =A0 =A0 =A0 =A0wait(NULL);
> =A0 =A0 =A0 =A0ptrace(PT_DETACH, pid, 0, 0);
> =A0 =A0 =A0 =A0return 0;
> }
>
> Am I using ptrace incorrectly or is there perhaps a bug in ptrace that
> causes the child to always segfault ?

    Nope -- it's a bug in your code. From ptrace(2):

     PT_CONTINUE   The traced process continues execution.  The addr argume=
nt
                   is an address specifying the place where execution is to=
 be
                   resumed (a new value for the program counter), or
                   (caddr_t)1 to indicate that execution is to pick up wher=
e
                   it left off.  The data argument provides a signal number=
 to
                   be delivered to the traced process as it resumes executi=
on,
                   or 0 if no signal is to be sent.

[...]

     PT_DETACH     This request is like PT_CONTINUE, except that it does no=
t
                   allow specifying an alternate place to continue executio=
n,
                   and after it succeeds, the traced process is no longer
                   traced and continues execution normally.

    Note very carefully the fact that PT_DETACH is like PT_CONTINUE,
and that PT_CONTINUE says that addr references the memory where the
execution is going to be resumed.
HTH,
-Garrett



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?p2i7d6fde3d1004291437y9b789015ybf8153b41e034d9f>