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.
This commit is contained in:
parent
3d184db2f8
commit
5985d61556
@ -635,7 +635,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
|
||||
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, pid_t pid, void *addr, int data)
|
||||
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, pid_t pid, void *addr, int data)
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user