[DTrace-devel] [PATCH] pid, usdt, stapsdt: refactor dependency on pcb and dpr

Eugene Loh eugene.loh at oracle.com
Thu Jan 22 19:38:46 UTC 2026


Reviewed-by: Eugene Loh <eugene.loh at oracle.com>

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 <kris.van.hees at oracle.com>
> ---
>   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;
>   }



More information about the DTrace-devel mailing list