Subject: Re: stopping childs (patch included)
To: Emmanuel Dreyfus <manu@netbsd.org>
From: Jaromir Dolecek <jdolecek@netbsd.org>
List: tech-kern
Date: 11/02/2002 08:11:12
Why exactly ptrace(PT_TRACE_ME, ...) call after the fork in the debugged app
is not enough for you?
Jaromir
Emmanuel Dreyfus wrote:
> Hi all
>
> I frequently have the need to stop a process on fork or exec, for debugging
> purposes. It can be done by tricking the process into an infinite loop, or by
> adding somes hacks in the kernel to send a SIGSTOP at the right time.
>
> Some support in the kernel to do this would be nice. My idea is to use a sysctl
> to set a value (named p_stopchild) stored in struct proc:
>
> $ sysctl -w proc.$$.stopchild=2
> proc.291.stopchild: 0 -> 2
> $ ls
> Here, the shell gets blocked after the fork. It's possible to attach it, or to
> send a SIGCONT. Once the process can continue after the fork, p_stopchild is
> decreased. Because it does not reach zero, we will stop again after the shell
> calls exec to become ls.
>
> Find below a patch that does the job. Is it good enough to be committed?
>
> Index: sys/proc.h
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/sys/proc.h,v
> retrieving revision 1.147
> diff -r1.147 proc.h
> 189a190
> > int p_stopchild; /* Stop childs on fork and exec */
> Index: sys/sysctl.h
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/sys/sysctl.h,v
> retrieving revision 1.78
> diff -r1.78 sysctl.h
> 593c593,594
> < #define PROC_PID_MAXID 3
> ---
> > #define PROC_PID_STOPCHILD 3
> > #define PROC_PID_MAXID 4
> 598a600
> > { "stopchild", CTLTYPE_INT }, \
> Index: kern/kern_sysctl.c
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/kern/kern_sysctl.c,v
> retrieving revision 1.113
> diff -r1.113 kern_sysctl.c
> 746a747,753
> > if (name[1] == PROC_PID_STOPCHILD) {
> > if (namelen != 2)
> > return EINVAL;
> > error = sysctl_int(oldp, oldlenp, newp,
> > newlen, &ptmp->p_stopchild);
> > return error;
> > }
> Index: kern/kern_exec.c
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/kern/kern_exec.c,v
> retrieving revision 1.160
> diff -r1.160 kern_exec.c
> 740a741,753
> >
> > if (p->p_stopchild) {
> > int s;
> >
> > sigminusset(&contsigmask, &p->p_sigctx.ps_siglist);
> > SCHED_LOCK(s);
> > p->p_stopchild--;
> > p->p_stat = SSTOP;
> > mi_switch(p, NULL);
> > SCHED_ASSERT_UNLOCKED();
> > splx(s);
> > }
> >
> Index: kern/kern_fork.c
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/kern/kern_fork.c,v
> retrieving revision 1.96
> diff -r1.96 kern_fork.c
> 474c474,475
> < * Make child runnable, set start time, and add to run queue.
> ---
> > * Make child runnable, set start time, and add to run queue
> > * except if the parent requested the child to start in SSTOP state.
> 479,480c480,487
> < p2->p_stat = SRUN;
> < setrunqueue(p2);
> ---
> > if (p1->p_stopchild) {
> > p2->p_stat = SSTOP;
> > p2->p_stopchild = p1->p_stopchild - 1;
> > p1->p_stopchild = 0;
> > } else {
> > p2->p_stat = SRUN;
> > setrunqueue(p2);
> > }
>
>
> --
> Emmanuel Dreyfus.
> "Le 80x86 n'est pas si complexe - il n'a simplement pas de sens"
> (Mike Johnson, responsable de la conception x86 chez AMD)
> manu@netbsd.org
>
--
Jaromir Dolecek <jdolecek@NetBSD.org> http://www.NetBSD.org/
-=- We should be mindful of the potential goal, but as the tantric -=-
-=- Buddhist masters say, ``You may notice during meditation that you -=-
-=- sometimes levitate or glow. Do not let this distract you.'' -=-