Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 9 Jul 2012 09:24:46 +0000 (UTC)
From:      David Xu <davidxu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r238287 - head/sys/kern
Message-ID:  <201207090924.q699OkB0007789@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



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