svn commit: r284343 - in stable: 10/sys/kern 10/sys/sys 9/sys/kern 9/sys/sys
Oliver Pinter
oliver.pinter at hardenedbsd.org
Sun Jun 14 10:39:30 UTC 2015
On Sat, Jun 13, 2015 at 6:15 PM, John Baldwin <jhb at freebsd.org> wrote:
> Author: jhb
> Date: Sat Jun 13 16:15:43 2015
> New Revision: 284343
> URL: https://svnweb.freebsd.org/changeset/base/284343
>
> Log:
> MFC 283546:
> Add KTR tracing for some MI ptrace events.
>
> Modified:
> stable/10/sys/kern/kern_exit.c
> stable/10/sys/kern/kern_fork.c
> stable/10/sys/kern/kern_sig.c
> stable/10/sys/kern/sys_process.c
> stable/10/sys/sys/ktr.h
> Directory Properties:
> stable/10/ (props changed)
>
> Changes in other areas also in this revision:
> Modified:
> stable/9/sys/kern/kern_exit.c
> stable/9/sys/kern/kern_fork.c
> stable/9/sys/kern/kern_sig.c
> stable/9/sys/kern/sys_process.c
> stable/9/sys/sys/ktr.h
> Directory Properties:
> stable/9/sys/ (props changed)
> stable/9/sys/sys/ (props changed)
>
> Modified: stable/10/sys/kern/kern_exit.c
> ==============================================================================
> --- stable/10/sys/kern/kern_exit.c Sat Jun 13 16:13:31 2015 (r284342)
> +++ stable/10/sys/kern/kern_exit.c Sat Jun 13 16:15:43 2015 (r284343)
> @@ -531,6 +531,8 @@ exit1(struct thread *td, int rv)
> */
> while ((q = LIST_FIRST(&p->p_orphans)) != NULL) {
> PROC_LOCK(q);
> + CTR2(KTR_PTRACE, "exit: pid %d, clearing orphan %d", p->p_pid,
> + q->p_pid);
> clear_orphan(q);
> PROC_UNLOCK(q);
> }
> @@ -865,6 +867,9 @@ proc_reap(struct thread *td, struct proc
> t = proc_realparent(p);
> PROC_LOCK(t);
> PROC_LOCK(p);
> + CTR2(KTR_PTRACE,
> + "wait: traced child %d moved back to parent %d", p->p_pid,
> + t->p_pid);
> proc_reparent(p, t);
> p->p_oppid = 0;
> PROC_UNLOCK(p);
> @@ -1219,6 +1224,10 @@ loop:
> PROC_UNLOCK(q);
> }
>
> + CTR4(KTR_PTRACE,
> + "wait: returning trapped pid %d status %#x (xstat %d) xthread %d",
> + p->p_pid, W_STOPCODE(p->p_xstat), p->p_xstat,
> + p->p_xthread != NULL ? p->p_xthread->td_tid : -1);
> PROC_UNLOCK(p);
> return (0);
> }
>
> Modified: stable/10/sys/kern/kern_fork.c
> ==============================================================================
> --- stable/10/sys/kern/kern_fork.c Sat Jun 13 16:13:31 2015 (r284342)
> +++ stable/10/sys/kern/kern_fork.c Sat Jun 13 16:15:43 2015 (r284343)
> @@ -1056,6 +1056,9 @@ fork_return(struct thread *td, struct tr
> dbg = p->p_pptr->p_pptr;
> p->p_flag |= P_TRACED;
> p->p_oppid = p->p_pptr->p_pid;
> + CTR2(KTR_PTRACE,
> + "fork_return: attaching to new child pid %d: oppid %d",
> + p->p_pid, p->p_oppid);
> proc_reparent(p, dbg);
> sx_xunlock(&proctree_lock);
> td->td_dbgflags |= TDB_CHILD;
>
> Modified: stable/10/sys/kern/kern_sig.c
> ==============================================================================
> --- stable/10/sys/kern/kern_sig.c Sat Jun 13 16:13:31 2015 (r284342)
> +++ stable/10/sys/kern/kern_sig.c Sat Jun 13 16:15:43 2015 (r284343)
> @@ -2484,6 +2484,8 @@ ptracestop(struct thread *td, int sig)
>
> td->td_dbgflags |= TDB_XSIG;
> td->td_xsig = sig;
> + CTR4(KTR_PTRACE, "ptracestop: tid %d (pid %d) flags %#x sig %d",
> + td->td_tid, p->p_pid, td->td_dbgflags, sig);
> PROC_SLOCK(p);
> while ((p->p_flag & P_TRACED) && (td->td_dbgflags & TDB_XSIG)) {
> if (p->p_flag & P_SINGLE_EXIT) {
>
> Modified: stable/10/sys/kern/sys_process.c
> ==============================================================================
> --- stable/10/sys/kern/sys_process.c Sat Jun 13 16:13:31 2015 (r284342)
> +++ stable/10/sys/kern/sys_process.c Sat Jun 13 16:15:43 2015 (r284343)
> @@ -432,6 +432,9 @@ ptrace_vm_entry(struct thread *td, struc
> free(freepath, M_TEMP);
> }
> }
> + if (error == 0)
> + CTR3(KTR_PTRACE, "PT_VM_ENTRY: pid %d, entry %d, start %p",
> + p->p_pid, pve->pve_entry, pve->pve_start);
>
> return (error);
> }
> @@ -826,6 +829,7 @@ kern_ptrace(struct thread *td, int req,
> if (p->p_flag & P_PPWAIT)
> p->p_flag |= P_PPTRACE;
> p->p_oppid = p->p_pptr->p_pid;
> + CTR1(KTR_PTRACE, "PT_TRACE_ME: pid %d", p->p_pid);
> break;
>
> case PT_ATTACH:
> @@ -845,17 +849,25 @@ kern_ptrace(struct thread *td, int req,
> proc_reparent(p, td->td_proc);
> }
> data = SIGSTOP;
> + CTR2(KTR_PTRACE, "PT_ATTACH: pid %d, oppid %d", p->p_pid,
> + p->p_oppid);
> goto sendsig; /* in PT_CONTINUE below */
>
> case PT_CLEARSTEP:
> + CTR2(KTR_PTRACE, "PT_CLEARSTEP: tid %d (pid %d)", td2->td_tid,
> + p->p_pid);
> error = ptrace_clear_single_step(td2);
> break;
>
> case PT_SETSTEP:
> + CTR2(KTR_PTRACE, "PT_SETSTEP: tid %d (pid %d)", td2->td_tid,
> + p->p_pid);
> error = ptrace_single_step(td2);
> break;
>
> case PT_SUSPEND:
> + CTR2(KTR_PTRACE, "PT_SUSPEND: tid %d (pid %d)", td2->td_tid,
> + p->p_pid);
> td2->td_dbgflags |= TDB_SUSPEND;
> thread_lock(td2);
> td2->td_flags |= TDF_NEEDSUSPCHK;
> @@ -863,10 +875,15 @@ kern_ptrace(struct thread *td, int req,
> break;
>
> case PT_RESUME:
> + CTR2(KTR_PTRACE, "PT_RESUME: tid %d (pid %d)", td2->td_tid,
> + p->p_pid);
> td2->td_dbgflags &= ~TDB_SUSPEND;
> break;
>
> case PT_FOLLOW_FORK:
> + CTR3(KTR_PTRACE, "PT_FOLLOW_FORK: pid %d %s -> %s", p->p_pid,
> + p->p_flag & P_FOLLOWFORK ? "enabled" : "disabled",
> + data ? "enabled" : "disabled");
> if (data)
> p->p_flag |= P_FOLLOWFORK;
> else
> @@ -887,6 +904,8 @@ kern_ptrace(struct thread *td, int req,
>
> switch (req) {
> case PT_STEP:
> + CTR2(KTR_PTRACE, "PT_STEP: tid %d (pid %d)",
> + td2->td_tid, p->p_pid);
> error = ptrace_single_step(td2);
> if (error)
> goto out;
> @@ -904,12 +923,25 @@ kern_ptrace(struct thread *td, int req,
> switch (req) {
> case PT_TO_SCE:
> p->p_stops |= S_PT_SCE;
> + CTR2(KTR_PTRACE,
> + "PT_TO_SCE: pid %d, stops = %#x", p->p_pid,
> + p->p_stops);
> break;
> case PT_TO_SCX:
> p->p_stops |= S_PT_SCX;
> + CTR2(KTR_PTRACE,
> + "PT_TO_SCX: pid %d, stops = %#x", p->p_pid,
> + p->p_stops);
> break;
> case PT_SYSCALL:
> p->p_stops |= S_PT_SCE | S_PT_SCX;
> + CTR2(KTR_PTRACE,
> + "PT_SYSCALL: pid %d, stops = %#x", p->p_pid,
> + p->p_stops);
> + break;
> + case PT_CONTINUE:
> + CTR1(KTR_PTRACE,
> + "PT_CONTINUE: pid %d", p->p_pid);
> break;
> }
> break;
> @@ -924,7 +956,11 @@ kern_ptrace(struct thread *td, int req,
> proc_reparent(p, pp);
> if (pp == initproc)
> p->p_sigparent = SIGCHLD;
> - }
> + CTR2(KTR_PTRACE,
> + "PT_DETACH: pid %d reparented to pid %d",
> + p->p_pid, pp->p_pid);
> + } else
> + CTR1(KTR_PTRACE, "PT_DETACH: pid %d", p->p_pid);
> p->p_oppid = 0;
> p->p_flag &= ~(P_TRACED | P_WAITED | P_FOLLOWFORK);
>
> @@ -1001,6 +1037,14 @@ kern_ptrace(struct thread *td, int req,
> }
> if (!write)
> td->td_retval[0] = tmp;
> + if (error == 0) {
> + if (write)
> + CTR3(KTR_PTRACE, "PT_WRITE: pid %d: %p <= %#x",
> + p->p_pid, addr, data);
> + else
> + CTR3(KTR_PTRACE, "PT_READ: pid %d: %p >= %#x",
> + p->p_pid, addr, tmp);
> + }
> PROC_LOCK(p);
> break;
>
> @@ -1033,10 +1077,14 @@ kern_ptrace(struct thread *td, int req,
> switch (tmp) {
> case PIOD_READ_D:
> case PIOD_READ_I:
> + CTR3(KTR_PTRACE, "PT_IO: pid %d: READ (%p, %#x)",
> + p->p_pid, (uintptr_t)uio.uio_offset, uio.uio_resid);
> uio.uio_rw = UIO_READ;
> break;
> case PIOD_WRITE_D:
> case PIOD_WRITE_I:
> + CTR3(KTR_PTRACE, "PT_IO: pid %d: WRITE (%p, %#x)",
> + p->p_pid, (uintptr_t)uio.uio_offset, uio.uio_resid);
> td2->td_dbgflags |= TDB_USERWR;
> uio.uio_rw = UIO_WRITE;
> break;
> @@ -1056,33 +1104,46 @@ kern_ptrace(struct thread *td, int req,
> break;
>
> case PT_KILL:
> + CTR1(KTR_PTRACE, "PT_KILL: pid %d", p->p_pid);
> data = SIGKILL;
> goto sendsig; /* in PT_CONTINUE above */
>
> case PT_SETREGS:
> + CTR2(KTR_PTRACE, "PT_SETREGS: tid %d (pid %d)", td2->td_tid,
> + p->p_pid);
> td2->td_dbgflags |= TDB_USERWR;
> error = PROC_WRITE(regs, td2, addr);
> break;
>
> case PT_GETREGS:
> + CTR2(KTR_PTRACE, "PT_GETREGS: tid %d (pid %d)", td2->td_tid,
> + p->p_pid);
> error = PROC_READ(regs, td2, addr);
> break;
>
> case PT_SETFPREGS:
> + CTR2(KTR_PTRACE, "PT_SETFPREGS: tid %d (pid %d)", td2->td_tid,
> + p->p_pid);
> td2->td_dbgflags |= TDB_USERWR;
> error = PROC_WRITE(fpregs, td2, addr);
> break;
>
> case PT_GETFPREGS:
> + CTR2(KTR_PTRACE, "PT_GETFPREGS: tid %d (pid %d)", td2->td_tid,
> + p->p_pid);
> error = PROC_READ(fpregs, td2, addr);
> break;
>
> case PT_SETDBREGS:
> + CTR2(KTR_PTRACE, "PT_SETDBREGS: tid %d (pid %d)", td2->td_tid,
> + p->p_pid);
> td2->td_dbgflags |= TDB_USERWR;
> error = PROC_WRITE(dbregs, td2, addr);
> break;
>
> case PT_GETDBREGS:
> + CTR2(KTR_PTRACE, "PT_GETDBREGS: tid %d (pid %d)", td2->td_tid,
> + p->p_pid);
> error = PROC_READ(dbregs, td2, addr);
> break;
>
> @@ -1145,13 +1206,21 @@ kern_ptrace(struct thread *td, int req,
> if (wrap32)
> ptrace_lwpinfo_to32(pl, pl32);
> #endif
> + CTR5(KTR_PTRACE,
> + "PT_LWPINFO: tid %d (pid %d) event %d flags %#x child pid %d",
> + td2->td_tid, p->p_pid, pl->pl_event, pl->pl_flags,
> + pl->pl_child_pid);
> break;
>
> case PT_GETNUMLWPS:
> + CTR2(KTR_PTRACE, "PT_GETNUMLWPS: pid %d: %d threads", p->p_pid,
> + p->p_numthreads);
> td->td_retval[0] = p->p_numthreads;
> break;
>
> case PT_GETLWPLIST:
> + CTR3(KTR_PTRACE, "PT_GETLWPLIST: pid %d: data %d, actual %d",
> + p->p_pid, data, p->p_numthreads);
> if (data <= 0) {
> error = EINVAL;
> break;
> @@ -1175,6 +1244,8 @@ kern_ptrace(struct thread *td, int req,
> break;
>
> case PT_VM_TIMESTAMP:
> + CTR2(KTR_PTRACE, "PT_VM_TIMESTAMP: pid %d: timestamp %d",
> + p->p_pid, p->p_vmspace->vm_map.timestamp);
> td->td_retval[0] = p->p_vmspace->vm_map.timestamp;
> break;
>
> @@ -1225,6 +1296,8 @@ stopevent(struct proc *p, unsigned int e
>
> PROC_LOCK_ASSERT(p, MA_OWNED);
> p->p_step = 1;
> + CTR3(KTR_PTRACE, "stopevent: pid %d event %u val %u", p->p_pid, event,
> + val);
> do {
> p->p_xstat = val;
> p->p_xthread = NULL;
>
> Modified: stable/10/sys/sys/ktr.h
> ==============================================================================
> --- stable/10/sys/sys/ktr.h Sat Jun 13 16:13:31 2015 (r284342)
> +++ stable/10/sys/sys/ktr.h Sat Jun 13 16:15:43 2015 (r284343)
> @@ -75,7 +75,8 @@
> #define KTR_INET6 0x10000000 /* IPv6 stack */
> #define KTR_SCHED 0x20000000 /* Machine parsed sched info. */
> #define KTR_BUF 0x40000000 /* Buffer cache */
> -#define KTR_ALL 0x7fffffff
> +#define KTR_PTRACE 0x80000000 /* Process debugging. */
> +#define KTR_ALL 0xffffffff
>
> /* Trace classes to compile in */
> #ifdef KTR
Hi John!
Could you please MFC this commit too:
commit 4331ca7813ee01d1745c6ff2ced7030329586b30
Author: jhb <jhb at FreeBSD.org>
Date: Fri May 22 11:09:41 2015 +0000
Expand ktr_mask to be a 64-bit unsigned integer.
The mask does not really need to be updated with atomic operations and
the downside of losing races during transitions is not great (it is
not marked volatile, so those races are pretty wide open as it is).
Differential Revision: https://reviews.freebsd.org/D2595
Reviewed by: emaste, neel, rpaulo
MFC after: 2 weeks
> _______________________________________________
> svn-src-stable-10 at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
> To unsubscribe, send any mail to "svn-src-stable-10-unsubscribe at freebsd.org"
More information about the svn-src-all
mailing list