Date: Thu, 3 Jan 2002 23:50:02 -0800 (PST) From: k Macy <kip_macy@yahoo.com> To: freebsd-bugs@FreeBSD.org Subject: ptrace bug was Re: gnu/33262: gdb does not handle pending signals correctly when single stepping Message-ID: <200201040750.g047o2O71774@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR gnu/33262; it has been noted by GNATS.
From: k Macy <kip_macy@yahoo.com>
To: Donald Gillies <dgillies@graviton.com>,
freebsd-gnats-submit@FreeBSD.org, freebsd-stable@freebsd.org,
freebsd-hackers@freebsd.org
Cc: kip_macy@yahoo.com
Subject: ptrace bug was Re: gnu/33262: gdb does not handle pending signals correctly when single stepping
Date: Thu, 3 Jan 2002 23:45:07 -0800 (PST)
Not to mention that SIGVTALRM is already used by
the thread library (although I would hope that
_thread_sys_sigaction is smart enough to handle
that case). I've stepped through the GDB
code on both 4.18 and 5.1. On 5.1 I found the
following in i386fbsd-nat.c:
void
child_resume (ptid_t ptid, int step, enum
target_signal signal)
{
pid_t pid = ptid_get_pid (ptid);
int request = PT_STEP;
if (pid == -1)
/* Resume all threads. This only gets used in the
non-threaded
case, where "resume all threads" and "resume
inferior_ptid" are
the same. */
pid = ptid_get_pid (inferior_ptid);
if (!step)
{
unsigned int eflags;
/* Workaround for a bug in FreeBSD. Make sure
that the trace
flag is off when doing a continue. There is
a code path
through the kernel which leaves the flag set
when it should
have been cleared. If a process has a signal
pending (such
as SIGALRM) and we do a PT_STEP, the process
never really has
a chance to run because the kernel needs to
notify the
debugger that a signal is being sent.
Therefore, the process
never goes through the kernel's trap()
function which would
normally clear it. */
eflags = read_register (PS_REGNUM);
if (eflags & 0x0100)
write_register (PS_REGNUM, eflags & ~0x0100);
request = PT_CONTINUE;
}
It is pretty clear that:
a) this does not deal with the case of step or next
b) this does not work in the case of continue often
times because step will be set to 1
and hence, this code does _not_ work around the bug.
This appears to be less of a GDB bug and more of a
kernel bug in ptrace.
-Kip
--- Donald Gillies <dgillies@graviton.com> wrote:
> I think this bug may be associated only with the
> SIGALRM signal. When I
> convert my code to use SIGVTALRM, the problem goes
> away. Unfortunately,
> SIGVTALRM does not do exactly
> what I am looking for !!
>
> # gdb 5.10
> # $FreeBSD: src/COPYRIGHT,v 1.4 1999/09/05 21:33:47
> obrien Exp $
> # @(#)COPYRIGHT 8.2 (Berkeley) 3/21/94
>
>
>
__________________________________________________
Do You Yahoo!?
Send your FREE holiday greetings online!
http://greetings.yahoo.com
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200201040750.g047o2O71774>
