svn commit: r238287 - head/sys/kern
David Xu
davidxu at FreeBSD.org
Mon Jul 9 09:24:47 UTC 2012
Author: davidxu
Date: Mon Jul 9 09:24:46 2012
New Revision: 238287
URL: http://svn.freebsd.org/changeset/base/238287
Log:
If you have pressed CTRL+Z and a process is suspended, then you use gdb
to attach to the process, it is surprising that the process is resumed
without inputting any gdb commands, however ptrace manual said:
The tracing process will see the newly-traced process stop and may
then control it as if it had been traced all along.
But the current code does not work in this way, unless traced process
received a signal later, it will continue to run as a background task.
To fix this problem, just send signal SIGSTOP to the traced process after
we resumed it, this works like that you are attaching to a running process,
it is not perfect but better than nothing.
Modified:
head/sys/kern/sys_process.c
Modified: head/sys/kern/sys_process.c
==============================================================================
--- head/sys/kern/sys_process.c Mon Jul 9 09:11:07 2012 (r238286)
+++ head/sys/kern/sys_process.c Mon Jul 9 09:24:46 2012 (r238287)
@@ -635,7 +635,7 @@ kern_ptrace(struct thread *td, int req,
struct iovec iov;
struct uio uio;
struct proc *curp, *p, *pp;
- struct thread *td2 = NULL;
+ struct thread *td2 = NULL, *td3;
struct ptrace_io_desc *piod = NULL;
struct ptrace_lwpinfo *pl;
int error, write, tmp, num;
@@ -953,10 +953,8 @@ kern_ptrace(struct thread *td, int req,
td2->td_xsig = data;
if (req == PT_DETACH) {
- struct thread *td3;
- FOREACH_THREAD_IN_PROC(p, td3) {
+ FOREACH_THREAD_IN_PROC(p, td3)
td3->td_dbgflags &= ~TDB_SUSPEND;
- }
}
/*
* unsuspend all threads, to not let a thread run,
@@ -967,6 +965,8 @@ kern_ptrace(struct thread *td, int req,
p->p_flag &= ~(P_STOPPED_TRACE|P_STOPPED_SIG|P_WAITED);
thread_unsuspend(p);
PROC_SUNLOCK(p);
+ if (req == PT_ATTACH)
+ kern_psignal(p, data);
} else {
if (data)
kern_psignal(p, data);
More information about the svn-src-head
mailing list