Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Apr 2010 23:18:27 +0100
From:      Bob Bishop <rb@gid.co.uk>
To:        Garrett Cooper <yanefbsd@gmail.com>
Cc:        freebsd-hackers@freebsd.org, Gunnar Hinriksson <tomtinn@gmail.com>
Subject:   Re: Ptrace segfault
Message-ID:  <9EF83DA6-B2D3-456E-B0AF-0B4F5F458A1F@gid.co.uk>
In-Reply-To: <p2i7d6fde3d1004291437y9b789015ybf8153b41e034d9f@mail.gmail.com>
References:  <q2vcbb19c781004291206sc54fdb6ag53c3a763ad364e8e@mail.gmail.com> <p2i7d6fde3d1004291437y9b789015ybf8153b41e034d9f@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,

On 29 Apr 2010, at 22:37, Garrett Cooper wrote:

> On Thu, Apr 29, 2010 at 12:06 PM, Gunnar Hinriksson =
<tomtinn@gmail.com> wrote:
>> Hello
>>=20
>> 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.
>>=20
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <sys/types.h>
>> #include <sys/ptrace.h>
>> #include <sys/wait.h>
>>=20
>> int main(int argc, char *argv[])
>> {
>>        int pid =3D atoi(argv[1]);
>>        ptrace(PT_ATTACH, pid, 0, 0);
>>        wait(NULL);
>>        ptrace(PT_DETACH, pid, 0, 0);
>>        return 0;
>> }
>>=20
>> Am I using ptrace incorrectly or is there perhaps a bug in ptrace =
that
>> causes the child to always segfault ?
>=20
>    Nope -- it's a bug in your code. =46rom ptrace(2):
>=20
>     PT_CONTINUE   The traced process continues execution.  The addr =
argument
>                   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 =
where
>                   it left off.  The data argument provides a signal =
number to
>                   be delivered to the traced process as it resumes =
execution,
>                   or 0 if no signal is to be sent.
>=20
> [...]
>=20
>     PT_DETACH     This request is like PT_CONTINUE, except that it =
does not
                                                                 =
^^^^^^^^^^^
>                   allow specifying an alternate place to continue =
execution,
                   =
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>                   and after it succeeds, the traced process is no =
longer
>                   traced and continues execution normally.
>=20
>    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.

Looks to me like a bug in ptrace(PT_DETACH,...) which to agree with =
ptrace(2) ought either to
(a) fail (EINVAL?) if addr !=3D (caddr_t)1, or
(b) ignore addr entirely; it's not clear which.

OP inferred (b) which is reasonable.

> HTH,
> -Garrett
> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to =
"freebsd-hackers-unsubscribe@freebsd.org"
>=20
>=20


--
Bob Bishop          +44 (0)118 940 1243
rb@gid.co.uk    fax +44 (0)118 940 1295
             mobile +44 (0)783 626 4518








Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9EF83DA6-B2D3-456E-B0AF-0B4F5F458A1F>