Re: [DTrace-devel] [PATCH] pid, usdt, stapsdt: refactor dependency on pcb and dpr
Eugene Loh <[email protected]> Thu, 22 Jan 2026 14:38:46 -0500
| Newsgroups | dev.linux.lists.dtrace |
|---|---|
| Message-ID | <[email protected]> |
Reviewed-by: Eugene Loh <[email protected]> On 1/21/26 17:57, Kris Van Hees via DTrace-devel wrote: > The pid/usdt/stapsdt handling code in dt_pid.c was passing along both > dtp and pcb, while dtp->dt_pcb is known to provide the value of pcb > already. This was done to handle a case where a fake pcb was being > passed (from dt_prov_uprobe.c) to ensure that dt_pid_error() would not > trigger a SEGV. > > After careful code analysis, dt_pid_error() is restructured to handle > the case of pcb and/or dpr being NULL, so that the fake pcb is no > longer needed, and we can use dtp to get to the (possibly NULL) pcb. > > Signed-off-by: Kris Van Hees <[email protected]> > --- > libdtrace/dt_cc.c | 4 +- > libdtrace/dt_pid.c | 194 ++++++++++++++++++------------------- > libdtrace/dt_pid.h | 8 +- > libdtrace/dt_prov_uprobe.c | 14 +-- > 4 files changed, 101 insertions(+), 119 deletions(-) > > diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c > index 1dc119ea..0b205c38 100644 > --- a/libdtrace/dt_cc.c > +++ b/libdtrace/dt_cc.c > @@ -275,13 +275,13 @@ dt_setcontext(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp) > isdigit(pdp->prv[strlen(pdp->prv) - 1]) && > ((pvp = dt_provider_lookup(dtp, pdp->prv)) == NULL || > pvp->pv_flags & DT_PROVIDER_PID) && > - dt_pid_create_pid_probes((dtrace_probedesc_t *)pdp, dtp, yypcb) != 0) > + dt_pid_create_pid_probes((dtrace_probedesc_t *)pdp, dtp) != 0) > longjmp(yypcb->pcb_jmpbuf, EDT_COMPILER); > > /* > * USDT probes. > */ > - if (dt_pid_create_usdt_probes((dtrace_probedesc_t *)pdp, dtp, yypcb) != 0) > + if (dt_pid_create_usdt_probes((dtrace_probedesc_t *)pdp, dtp) != 0) > longjmp(yypcb->pcb_jmpbuf, EDT_COMPILER); > > /* > diff --git a/libdtrace/dt_pid.c b/libdtrace/dt_pid.c > index 36a5883b..91c2c13a 100644 > --- a/libdtrace/dt_pid.c > +++ b/libdtrace/dt_pid.c > @@ -46,7 +46,6 @@ > */ > typedef struct dt_pid_probe { > dtrace_hdl_t *dpp_dtp; > - dt_pcb_t *dpp_pcb; > dt_proc_t *dpp_dpr; > struct ps_prochandle *dpp_pr; > const char *dpp_mod; > @@ -82,24 +81,26 @@ dt_pid_objname(Lmid_t lmid, const char *obj) > } > > static int > -dt_pid_error(dtrace_hdl_t *dtp, dt_pcb_t *pcb, dt_proc_t *dpr, > - dt_errtag_t tag, const char *fmt, ...) > +dt_pid_error(dtrace_hdl_t *dtp, dt_proc_t *dpr, dt_errtag_t tag, > + const char *fmt, ...) > { > - va_list ap; > - int len; > + va_list ap; > + dt_pcb_t *pcb = dtp->dt_pcb; > > va_start(ap, fmt); > - if (pcb == NULL) { > - assert(dpr != NULL); > + if (pcb != NULL) { > + dt_set_errmsg(dtp, dt_errtag(tag), pcb->pcb_region, > + pcb->pcb_filetag, pcb->pcb_fileptr ? yylineno : 0, fmt, ap); > + } else if (dpr != NULL) { > + int len; > + > len = vsnprintf(dpr->dpr_errmsg, sizeof(dpr->dpr_errmsg), > - fmt, ap); > + fmt, ap); > assert(len >= 2); > if (dpr->dpr_errmsg[len - 2] == '\n') > dpr->dpr_errmsg[len - 2] = '\0'; > - } else { > - dt_set_errmsg(dtp, dt_errtag(tag), pcb->pcb_region, > - pcb->pcb_filetag, pcb->pcb_fileptr ? yylineno : 0, fmt, ap); > - } > + } else > + dt_set_errmsg(dtp, dt_errtag(tag), NULL, NULL, 0, fmt, ap); > va_end(ap); > > return 1; > @@ -151,7 +152,6 @@ static int > dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) > { > dtrace_hdl_t *dtp = pp->dpp_dtp; > - dt_pcb_t *pcb = pp->dpp_pcb; > dt_proc_t *dpr = pp->dpp_dpr; > pid_probespec_t *psp; > uint64_t off; > @@ -195,7 +195,7 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) > > off = strtoull(pp->dpp_name, &end, 16); > if (*end != '\0') { > - rc = dt_pid_error(dtp, pcb, dpr, D_PROC_NAME, > + rc = dt_pid_error(dtp, dpr, D_PROC_NAME, > "'%s' is an invalid probe name", > pp->dpp_name); > goto out; > @@ -204,8 +204,9 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) > psp->pps_nameoff = off; > > if (dt_Plookup_by_addr(dtp, pid, off, (const char **)&psp->pps_fun, &sym)) { > - rc = dt_pid_error(dtp, pcb, dpr, D_PROC_NAME, > - "failed to lookup 0x%lx in module '%s'", off, pp->dpp_mod); > + rc = dt_pid_error(dtp, dpr, D_PROC_NAME, > + "failed to lookup 0x%lx in module '%s'", > + off, pp->dpp_mod); > if (psp->pps_fun != func && psp->pps_fun != NULL) > free(psp->pps_fun); > goto out; > @@ -215,9 +216,10 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) > psp->pps_off = off - pp->dpp_vaddr; > > if (dt_pid_create_one_probe(pp->dpp_pr, dtp, psp, DTPPT_ABSOFFSETS) < 0) > - rc = dt_pid_error(dtp, pcb, dpr, D_PROC_CREATEFAIL, > - "failed to create probes at '%s+0x%llx': %s", > - func, (unsigned long long)off, dtrace_errmsg(dtp, dtrace_errno(dtp))); > + rc = dt_pid_error(dtp, dpr, D_PROC_CREATEFAIL, > + "failed to create probes at '%s+0x%llx': %s", > + func, (unsigned long long)off, > + dtrace_errmsg(dtp, dtrace_errno(dtp))); > else > pp->dpp_nmatches++; > free(psp->pps_fun); > @@ -226,8 +228,7 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) > > if (gmatch("return", pp->dpp_name)) { > if (dt_pid_create_one_probe(pp->dpp_pr, dtp, psp, DTPPT_RETURN) < 0) { > - rc = dt_pid_error( > - dtp, pcb, dpr, D_PROC_CREATEFAIL, > + rc = dt_pid_error(dtp, dpr, D_PROC_CREATEFAIL, > "failed to create return probe for '%s': %s", > func, dtrace_errmsg(dtp, dtrace_errno(dtp))); > goto out; > @@ -238,8 +239,7 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) > > if (gmatch("entry", pp->dpp_name)) { > if (dt_pid_create_one_probe(pp->dpp_pr, dtp, psp, DTPPT_ENTRY) < 0) { > - rc = dt_pid_error( > - dtp, pcb, dpr, D_PROC_CREATEFAIL, > + rc = dt_pid_error(dtp, dpr, D_PROC_CREATEFAIL, > "failed to create entry probe for '%s': %s", > func, dtrace_errmsg(dtp, dtrace_errno(dtp))); > goto out; > @@ -254,15 +254,14 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) > > off = strtoull(pp->dpp_name, &end, 16); > if (*end != '\0') { > - rc = dt_pid_error(dtp, pcb, dpr, D_PROC_NAME, > + rc = dt_pid_error(dtp, dpr, D_PROC_NAME, > "'%s' is an invalid probe name", > pp->dpp_name); > goto out; > } > > if (off >= symp->st_size) { > - rc = dt_pid_error( > - dtp, pcb, dpr, D_PROC_OFF, > + rc = dt_pid_error(dtp, dpr, D_PROC_OFF, > "offset 0x%llx outside of function '%s'", > (unsigned long long)off, func); > goto out; > @@ -272,8 +271,7 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) > psp->pps_off = symp->st_value - pp->dpp_vaddr + off; > if (dt_pid_create_one_probe(pp->dpp_pr, dtp, > psp, DTPPT_OFFSETS) < 0) { > - rc = dt_pid_error( > - dtp, pcb, dpr, D_PROC_CREATEFAIL, > + rc = dt_pid_error(dtp, dpr, D_PROC_CREATEFAIL, > "failed to create probes at '%s+0x%llx': %s", > func, (unsigned long long)off, > dtrace_errmsg(dtp, dtrace_errno(dtp))); > @@ -460,7 +458,6 @@ dt_pid_per_mod(void *arg, const prmap_t *pmp, const char *obj) > { > dt_pid_probe_t *pp = arg; > dtrace_hdl_t *dtp = pp->dpp_dtp; > - dt_pcb_t *pcb = pp->dpp_pcb; > dt_proc_t *dpr = pp->dpp_dpr; > pid_t pid = Pgetpid(dpr->dpr_proc); > GElf_Sym sym; > @@ -504,8 +501,7 @@ dt_pid_per_mod(void *arg, const prmap_t *pmp, const char *obj) > if (dt_Pxlookup_by_name(dtp, pid, pp->dpp_lmid, obj, > pp->dpp_func, &sym, NULL) != 0) { > if (!strisglob(pp->dpp_mod)) { > - return dt_pid_error( > - dtp, pcb, dpr, D_PROC_FUNC, > + return dt_pid_error(dtp, dpr, D_PROC_FUNC, > "failed to lookup '%s' in module '%s'", > pp->dpp_func, pp->dpp_mod); > } else > @@ -635,7 +631,7 @@ dt_pid_fix_mod(dt_pid_probe_t *pp, dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, > */ > static int > dt_pid_create_pid_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, > - dt_pcb_t *pcb, dt_proc_t *dpr) > + dt_proc_t *dpr) > { > dt_pid_probe_t pp; > int ret = 0; > @@ -644,7 +640,6 @@ dt_pid_create_pid_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, > pp.dpp_dtp = dtp; > pp.dpp_dpr = dpr; > pp.dpp_pr = dpr->dpr_proc; > - pp.dpp_pcb = pcb; > pp.dpp_nmatches = 0; > pp.dpp_dev = makedev(0, 0); > pp.dpp_inum = 0; > @@ -654,7 +649,7 @@ dt_pid_create_pid_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, > * we get a nicer error message.) > */ > if (pid == getpid()) > - return dt_pid_error(dtp, pcb, dpr, D_PROC_DYN, > + return dt_pid_error(dtp, dpr, D_PROC_DYN, > "process %s is dtrace itself", > &pdp->prv[3]); > > @@ -663,7 +658,7 @@ dt_pid_create_pid_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, > * hidden some magic in ld.so.1 as well as libc.so.1). > */ > if (dt_Pname_to_map(dtp, pid, PR_OBJ_LDSO) == NULL) { > - return dt_pid_error(dtp, pcb, dpr, D_PROC_DYN, > + return dt_pid_error(dtp, dpr, D_PROC_DYN, > "process %s is not a dynamically-linked executable", > &pdp->prv[3]); > } > @@ -685,15 +680,15 @@ dt_pid_create_pid_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, > (aout = dt_Pname_to_map(dtp, pid, "a.out")) == NULL || > (pmp = dt_Pname_to_map(dtp, pid, pp.dpp_mod)) == NULL || > aout->pr_vaddr != pmp->pr_vaddr) { > - return dt_pid_error(dtp, pcb, dpr, D_PROC_LIB, > - "only the a.out module is valid with the " > - "'-' function"); > + return dt_pid_error(dtp, dpr, D_PROC_LIB, > + "only the a.out module is valid with the " > + "'-' function"); > } > > if (strisglob(pp.dpp_name)) { > - return dt_pid_error(dtp, pcb, dpr, D_PROC_NAME, > - "only individual addresses may be specified " > - "with the '-' function"); > + return dt_pid_error(dtp, dpr, D_PROC_NAME, > + "only individual addresses may be specified " > + "with the '-' function"); > } > } > > @@ -818,7 +813,7 @@ validate_dof_record(const char *path, const dof_parsed_t *parsed, > */ > static int > dt_pid_create_usdt_probes_proc(dtrace_hdl_t *dtp, pid_t pid, dt_proc_t *dpr, > - dtrace_probedesc_t *pdp, dt_pcb_t *pcb) > + dtrace_probedesc_t *pdp) > { > const dt_provider_t *pvp; > int ret = 0; > @@ -897,8 +892,8 @@ dt_pid_create_usdt_probes_proc(dtrace_hdl_t *dtp, pid_t pid, dt_proc_t *dpr, > if (dpr_caller == 0) { > if (dt_proc_grab_lock(dtp, pid, DTRACE_PROC_WAITING | > DTRACE_PROC_SHORTLIVED) < 0) { > - dt_pid_error(dtp, pcb, NULL, D_PROC_GRAB, > - "failed to grab process %d", (int)pid); > + dt_pid_error(dtp, NULL, D_PROC_GRAB, > + "failed to grab process %d", (int)pid); > return -1; > } > dpr = dt_proc_lookup(dtp, pid); > @@ -1041,11 +1036,11 @@ dt_pid_create_usdt_probes_proc(dtrace_hdl_t *dtp, pid_t pid, dt_proc_t *dpr, > > psp.pps_fn = Pmap_mapfile_name(dpr->dpr_proc, pmp); > if (psp.pps_fn == NULL) { > - dt_pid_error(dtp, pcb, dpr, D_PROC_USDT, > - "Cannot get name of mapping containing " > - "%sprobe %s for pid %d\n", > - tp->tracepoint.is_enabled ? "is-enabled ": "", > - prb, dpr->dpr_pid); > + dt_pid_error(dtp, dpr, D_PROC_USDT, > + "Cannot get name of mapping containing " > + "%sprobe %s for pid %d\n", > + tp->tracepoint.is_enabled ? "is-enabled ": "", > + prb, dpr->dpr_pid); > goto oom; > } > > @@ -1082,11 +1077,11 @@ dt_pid_create_usdt_probes_proc(dtrace_hdl_t *dtp, pid_t pid, dt_proc_t *dpr, > psp.pps_prv, psp.pps_mod, psp.pps_fun, > psp.pps_prb, psp.pps_pid, psp.pps_off); > if (pvp->impl->provide_probe(dtp, &psp) < 0) { > - dt_pid_error(dtp, pcb, dpr, D_PROC_USDT, > - "failed to instantiate %sprobe %s for pid %d: %s", > - tp->tracepoint.is_enabled ? "is-enabled ": "", > - psp.pps_prb, psp.pps_pid, > - dtrace_errmsg(dtp, dtrace_errno(dtp))); > + dt_pid_error(dtp, dpr, D_PROC_USDT, > + "failed to instantiate %sprobe %s for pid %d: %s", > + tp->tracepoint.is_enabled ? "is-enabled ": "", > + psp.pps_prb, psp.pps_pid, > + dtrace_errmsg(dtp, dtrace_errno(dtp))); > ret = -1; > } > free(psp.pps_fn); > @@ -1183,7 +1178,7 @@ dt_pid_usdt_mapping(void *data, const prmap_t *pmp, const char *oname) > * Extract the pid from a USDT provider name. > */ > pid_t > -dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb, > +dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, > dt_proc_t *dpr) > { > pid_t pid; > @@ -1196,7 +1191,7 @@ dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb, > } > > if (last == NULL || (*(++last) == '\0')) { > - dt_pid_error(dtp, pcb, dpr, D_PROC_BADPROV, > + dt_pid_error(dtp, dpr, D_PROC_BADPROV, > "'%s' is not a valid provider", pdp->prv); > return -1; > } > @@ -1205,7 +1200,7 @@ dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb, > pid = strtol(last, &end, 10); > > if (errno != 0 || end == last || end[0] != '\0' || pid <= 0) { > - dt_pid_error(dtp, pcb, dpr, D_PROC_BADPID, > + dt_pid_error(dtp, dpr, D_PROC_BADPID, > "'%s' does not contain a valid pid", pdp->prv); > return -1; > } > @@ -1218,24 +1213,22 @@ dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb, > * created, since there might still be USDT probes) and -1 on error. > */ > int > -dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb) > +dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp) > { > pid_t pid; > char provname[DTRACE_PROVNAMELEN]; > dt_proc_t *dpr; > int err; > > - assert(pcb != NULL); > - > /* Exclude pid0 from being specifically requested. */ > if (strcmp(pdp->prv, "pid0") == 0) { > - dt_pid_error(dtp, pcb, NULL, D_PROC_BADPID, > + dt_pid_error(dtp, NULL, D_PROC_BADPID, > "pid0 does not contain a valid pid"); > return -1; > } > > /* Extract the pid. */ > - pid = dt_pid_get_pid(pdp, dtp, pcb, NULL); > + pid = dt_pid_get_pid(pdp, dtp, NULL); > if (pid <= 0) > return 0; > > @@ -1247,15 +1240,15 @@ dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *p > /* Grab the process. */ > if (dt_proc_grab_lock(dtp, pid, DTRACE_PROC_WAITING | > DTRACE_PROC_SHORTLIVED) < 0) { > - dt_pid_error(dtp, pcb, NULL, D_PROC_GRAB, > - "failed to grab process %d", (int)pid); > + dt_pid_error(dtp, NULL, D_PROC_GRAB, > + "failed to grab process %d", (int)pid); > return -1; > } > dpr = dt_proc_lookup(dtp, pid); > assert(dpr != NULL); > > /* Create the pid probes for this process. */ > - err = dt_pid_create_pid_probes_proc(pdp, dtp, pcb, dpr); > + err = dt_pid_create_pid_probes_proc(pdp, dtp, dpr); > dt_proc_release_unlock(dtp, pid); > > return err; > @@ -1263,8 +1256,7 @@ dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *p > > static int > dt_stapsdt_parse(dtrace_hdl_t *dtp, dt_proc_t *dpr, dtrace_probedesc_t *pdp, > - dt_pcb_t *pcb, const dt_provider_t *pvp, char *path, > - unsigned long addr_start) > + const dt_provider_t *pvp, char *path, unsigned long addr_start) > { > size_t shstrndx, noff, doff, off, n; > const prmap_t *pmp = NULL; > @@ -1282,8 +1274,7 @@ dt_stapsdt_parse(dtrace_hdl_t *dtp, dt_proc_t *dpr, dtrace_probedesc_t *pdp, > > fd = open(path, O_RDONLY); > if (fd < 0) { > - dt_pid_error(dtp, pcb, dpr, D_PROC_USDT, > - "Cannot open %s: %s\n", > + dt_pid_error(dtp, dpr, D_PROC_USDT, "Cannot open %s: %s\n", > path, strerror(errno)); > return -1; > } > @@ -1400,9 +1391,9 @@ dt_stapsdt_parse(dtrace_hdl_t *dtp, dt_proc_t *dpr, dtrace_probedesc_t *pdp, > mapfile = Pmap_mapfile_name(dpr->dpr_proc, pmp); > > if (!mapfile) { > - dt_pid_error(dtp, pcb, dpr, D_PROC_USDT, > - "Cannot get name of mapping containing probe %s for pid %d\n", > - psp.pps_prb, dpr->dpr_pid); > + dt_pid_error(dtp, dpr, D_PROC_USDT, > + "Cannot get name of mapping containing probe %s for pid %d\n", > + psp.pps_prb, dpr->dpr_pid); > err = -1; > break; > } > @@ -1418,10 +1409,10 @@ dt_stapsdt_parse(dtrace_hdl_t *dtp, dt_proc_t *dpr, dtrace_probedesc_t *pdp, > psp.pps_nameoff = 0; > > if (pvp->impl->provide_probe(dtp, &psp) < 0) { > - dt_pid_error(dtp, pcb, dpr, D_PROC_USDT, > - "failed to instantiate probe %s for pid %d: %s", > - psp.pps_prb, psp.pps_pid, > - dtrace_errmsg(dtp, dtrace_errno(dtp))); > + dt_pid_error(dtp, dpr, D_PROC_USDT, > + "failed to instantiate probe %s for pid %d: %s", > + psp.pps_prb, psp.pps_pid, > + dtrace_errmsg(dtp, dtrace_errno(dtp))); > err = -1; > } > if (err == -1) > @@ -1440,8 +1431,8 @@ out: > > static void > dt_pid_create_stapsdt_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, > - dt_pcb_t *pcb, const dt_provider_t *pvp, > - dt_proc_t *dpr, const char *proc_map) > + const dt_provider_t *pvp, dt_proc_t *dpr, > + const char *proc_map) > { > char line[1024]; > FILE *fp = NULL; > @@ -1493,12 +1484,12 @@ dt_pid_create_stapsdt_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, > pid, dirent->d_name); > if (stat(path, &s) != 0 || s.st_ino != inode) > continue; > - if (dt_stapsdt_parse(dtp, dpr, pdp, pcb, pvp, > - path, addr_start - file_offset) != 0) > + if (dt_stapsdt_parse(dtp, dpr, pdp, pvp, path, > + addr_start - file_offset) != 0) > break; > } > } else { > - if (dt_stapsdt_parse(dtp, dpr, pdp, pcb, pvp, name, > + if (dt_stapsdt_parse(dtp, dpr, pdp, pvp, name, > addr_start - file_offset) != 0) > break; > } > @@ -1507,7 +1498,7 @@ dt_pid_create_stapsdt_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, > } > > static int > -dt_pid_create_stapsdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb) > +dt_pid_create_stapsdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp) > { > const dt_provider_t *pvp; > dt_proc_t *dpr = NULL; > @@ -1518,8 +1509,6 @@ dt_pid_create_stapsdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_ > if (len == 0) > return 0; > > - assert(pcb != NULL); > - > pidstr = &pdp->prv[len]; > > while (isdigit(*(pidstr - 1))) > @@ -1535,20 +1524,27 @@ dt_pid_create_stapsdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_ > return 0; > if (dt_proc_grab_lock(dtp, pid, DTRACE_PROC_WAITING | > DTRACE_PROC_SHORTLIVED) < 0) { > - dt_pid_error(dtp, pcb, NULL, D_PROC_GRAB, > - "failed to grab process %d", > - (int)pid); > + dt_pid_error(dtp, NULL, D_PROC_GRAB, > + "failed to grab process %d", (int)pid); > return 1; > } > dpr = dt_proc_lookup(dtp, pid); > if (dpr) { > char *path = NULL; > > - if (asprintf(&path, "/proc/%s/maps", pidstr) == -1) > - longjmp(pcb->pcb_jmpbuf, EDT_NOMEM); > - dt_pid_create_stapsdt_probes_proc(pdp, dtp, pcb, > - pvp, dpr, path); > - free(path); > + if (asprintf(&path, "/proc/%s/maps", pidstr) == -1) { > + if (dtp->dt_pcb != NULL) > + longjmp(dtp->dt_pcb->pcb_jmpbuf, EDT_NOMEM); > + else > + path = NULL; > + } > + > + if (path != NULL) { > + dt_pid_create_stapsdt_probes_proc(pdp, dtp, pvp, dpr, > + path); > + free(path); > + } > + > dt_proc_release_unlock(dtp, pid); > } > > @@ -1556,14 +1552,12 @@ dt_pid_create_stapsdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_ > } > > int > -dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb) > +dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp) > { > glob_t globbuf; > char *globpat = NULL; > int err = 0, i, nmatches = 0; > > - assert(pcb != NULL); > - > /* If it cannot end with a pid, we're done. */ > if (pdp->prv[0] != '\0') { > char lastchar = pdp->prv[strlen(pdp->prv) - 1]; > @@ -1606,14 +1600,14 @@ dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t * > pdptmp.prb = pdp->prb[0] == '\0' ? "*" : pdp->prb; > > /* Create USDT probes for this process. */ > - if (dt_pid_create_usdt_probes_proc(dtp, pid, NULL, &pdptmp, pcb)) > + if (dt_pid_create_usdt_probes_proc(dtp, pid, NULL, &pdptmp)) > err = 1; > } > free(globpat); > globfree(&globbuf); > > if (err == 0) > - err = dt_pid_create_stapsdt_probes(pdp, dtp, pcb); > + err = dt_pid_create_stapsdt_probes(pdp, dtp); > > /* If no errors, report success. */ > if (err == 0) > @@ -1667,7 +1661,7 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr) > dtrace_probedesc_t pd; > > pdp = &stp->ds_desc->dtsd_ecbdesc->dted_probe; > - pid = dt_pid_get_pid(pdp, dtp, NULL, dpr); > + pid = dt_pid_get_pid(pdp, dtp, dpr); > if (pid != dpr->dpr_pid) > continue; > > @@ -1675,7 +1669,7 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr) > pd.fun = strdup(pd.fun); /* we may change it */ > > if (gmatch(provname, pdp->prv) != 0 && > - dt_pid_create_pid_probes_proc(&pd, dtp, NULL, dpr) != 0) > + dt_pid_create_pid_probes_proc(&pd, dtp, dpr) != 0) > ret = 1; > > /* > @@ -1683,7 +1677,7 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr) > * a USDT provider. > */ > if (strcmp(provname, pdp->prv) != 0) { > - if (dt_pid_create_usdt_probes_proc(dtp, -1, dpr, pdp, NULL) < 0) > + if (dt_pid_create_usdt_probes_proc(dtp, -1, dpr, pdp) < 0) > ret = 1; > else > dt_pid_fix_mod(NULL, pdp, dtp, dpr->dpr_pid); > diff --git a/libdtrace/dt_pid.h b/libdtrace/dt_pid.h > index c35adc2c..f59bdfdd 100644 > --- a/libdtrace/dt_pid.h > +++ b/libdtrace/dt_pid.h > @@ -16,12 +16,10 @@ > extern "C" { > #endif > > -extern int dt_pid_create_pid_probes(dtrace_probedesc_t *, dtrace_hdl_t *, > - dt_pcb_t *); > -extern int dt_pid_create_usdt_probes(dtrace_probedesc_t *, dtrace_hdl_t *, > - dt_pcb_t *); > +extern int dt_pid_create_pid_probes(dtrace_probedesc_t *, dtrace_hdl_t *); > +extern int dt_pid_create_usdt_probes(dtrace_probedesc_t *, dtrace_hdl_t *); > extern int dt_pid_create_probes_module(dtrace_hdl_t *, dt_proc_t *); > -extern pid_t dt_pid_get_pid(const dtrace_probedesc_t *, dtrace_hdl_t *, dt_pcb_t *, > +extern pid_t dt_pid_get_pid(const dtrace_probedesc_t *, dtrace_hdl_t *, > dt_proc_t *); > > #ifdef __cplusplus > diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c > index e94827f2..101956e5 100644 > --- a/libdtrace/dt_prov_uprobe.c > +++ b/libdtrace/dt_prov_uprobe.c > @@ -645,23 +645,13 @@ static int add_probe_usdt(dtrace_hdl_t *dtp, dt_probe_t *prp) > static int discover(dtrace_hdl_t *dtp) > { > int i; > - dt_pcb_t pcb; > > /* Clean up stale pids from among the USDT probes. */ > clean_usdt_probes(dtp); > > /* Discover new probes, placing them in dt_probes[]. */ > - /* > - * pcb is only used inside of dt_pid_error() to get: > - * pcb->pcb_region > - * pcb->pcb_filetag > - * pcb->pcb_fileptr > - * While pcb cannot be NULL, these other things apparently can be. > - */ > - memset(&pcb, 0, sizeof(dt_pcb_t)); > - for (i = 0; i < dtp->dt_stmt_nextid; i++) { > - dt_pid_create_usdt_probes(&dtp->dt_stmts[i]->dtsd_ecbdesc->dted_probe, dtp, &pcb); > - } > + for (i = 0; i < dtp->dt_stmt_nextid; i++) > + dt_pid_create_usdt_probes(&dtp->dt_stmts[i]->dtsd_ecbdesc->dted_probe, dtp); > > return 0; > }