I've been looking at this bug. What I think needs to be done is the following:
- In dt_proc_control(), create a separate dtrace handle with the
destructive option set.
- In dt_proc_bp_create() (or the equivalent-but-renamed function), do
something similar to the following instead of creating a breakpoint
(where dtp is this new handle):
sprintf(dprog, "pid%d::-:%x {stop();}", (int)dpr->dpr_pid,
dbp->dbp_addr);
if ((pgp = dtrace_program_strcompile(dtp, dprog,
DTRACE_PROBESPEC_NAME, DTRACE_C_NOLIBS, 0, NULL))
== NULL) {
dt_dprintf("pid %d: failed to compile pid breakpoint "
"at 0x%x\n", (int)dpr->dpr_pid, dbp->dbp_addr);
} else if (dtrace_program_exec(dtp, pgp, NULL)
== -1) {
dt_dprintf("pid %d: failed to create pid breakpoint "
"at 0x%x\n", (int)dpr->dpr_pid, dbp->dbp_addr);
} else {
dbp->dbp_active = B_TRUE;
}
- In the dt_proc_bpmatch() equivalent, match exactly as we currently
do, by comparing the current PC with dbp->dbp_addr (but not executing
the breakpoint-replaced instruction).
- In dt_proc_control(), call the dt_proc_bpmatch() equivalent similar
to the following ("pbp" for "pid breakpoint", for want of a better
name):
case PS_STOP:
psp = &Pstatus(P)->pr_lwp;
if (psp->pr_why == PR_REQUESTED) {
if (dt_proc_pbpmatch(pbp_dtp, dpr) == -1) {
dt_proc_waitrun(dpr);
(void) pthread_mutex_unlock(
&dpr->dpr_lock);
continue;
}
}
(There's still the question of what to do with dt_proc_bpdestroy(),
dt_proc_bpenable() and dt_proc_disable().)
I've tried the above, and I see the probes being created, but these
probes never fire. What's more, the probes in the D script I'm
running are never created, although I believe that's just because the
RD_DLACTIVITY probe is never firing, thus
dt_pid_create_probes_module() is never called.
Any ideas? I've put a copy of dt_proc.[ch] and DTRACE_DEBUG output at
http://cr.opensolaris.org/~cmynhier/6593259/ if you want to look at
it.
Thanks,
Chad
_______________________________________________
dtrace-discuss mailing list
[email protected]