[DTrace-devel] [PATCH 6/6] Add support for pid function "-" with absolute offset
Eugene Loh
eugene.loh at oracle.com
Thu Jan 9 20:52:28 UTC 2025
On 1/9/25 14:12, Kris Van Hees wrote:
> On Fri, Dec 20, 2024 at 05:27:16PM -0500, eugene.loh--- via DTrace-devel wrote:
>> diff --git a/include/dtrace/pid.h b/include/dtrace/pid.h
>> @@ -47,6 +47,7 @@ typedef struct pid_probespec {
>> /*
>> * Fields below this point do not apply to underlying probes.
>> */
>> + int pps_absoff; /* use "-" for overlying probe function */
> Why use this? All you do with it is record that func is "-", and then later
> in the pid provider, you actually use that to force the function name in the
> probe description to be "-". But that function name in the probe desc is (in
> the pid provider) already coming from pps_fun, and the code was already
> assigning func to pps_fun, so it would be "-" anyway. So the pps_absoff seems
> to serve no purpose, and you could just rely on pps_fun being "-" when needed.
Yeah, good point. Let me see if I can remember/understand/explain
what's going on here.
In essence, the problem is we have to pass two function names: "-" (for
the overlying probe) and the actual function name (for the underlying
probe); up until now, they were both the same. I tossed around
different ideas for this. E.g., pass two function names in. Or, get the
actual function name inside dt_prov_uprobe. It seemed to make most
sense (given the alternatives) to pass in the actual function name and
add this flag to say when the overlying probe's function name should be
"-". Does that make sense?
Note that pps_fun is not "-". Although we set it to func ("-"), the
code that processes this case then fills pps_fun in with the actual
function name. Again, one option is not to do this until
dt_prov_uprobe.c, but that introduces some other hassles.
>> pid_t pps_pid; /* task PID */
>> uint64_t pps_nameoff; /* offset to use for name */
>> } pid_probespec_t;
>> diff --git a/libdtrace/dt_pid.c b/libdtrace/dt_pid.c
>> @@ -182,8 +181,50 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
>> psp->pps_fun = (char *) func;
>> psp->pps_nameoff = 0;
>> psp->pps_off = symp->st_value - pp->dpp_vaddr;
>> + psp->pps_absoff = 0;
>>
>> - if (!isdash && gmatch("return", pp->dpp_name)) {
>> + /*
>> + * The special function "-" means the probe name is an absolute
>> + * virtual address.
>> + */
>> + if (strcmp("-", func) == 0) {
>> + char *end;
>> + GElf_Sym sym;
>> +
>> + off = strtoull(pp->dpp_name, &end, 16);
>> +
>> + psp->pps_absoff = 1;
>> + 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);
>> + if (psp->pps_fun != func && psp->pps_fun != NULL)
>> + free(psp->pps_fun);
>> + goto out;
>> + }
>> +
>> + psp->pps_prb = (char*)pp->dpp_name; // make sure dt_prov_uprobe uses it
>> + psp->pps_off = off - sym.st_value; // make sure dt_prov_uprobe uses it // dump this
>> + psp->pps_off = off - pp->dpp_vaddr; // make sure dt_prov_uprobe uses it
>> +
>> + if (dt_pid_create_one_probe(pp->dpp_pr, dtp, psp, DTPPT_OFFSETS) < 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)));
>> + else
>> + pp->dpp_nmatches++;
>> + free(psp->pps_fun);
>> + goto out;
>> + }
>> +
>> + 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,
>> diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
>> index acf1c914f..ae4b262ac 100644
>> --- a/libdtrace/dt_prov_uprobe.c
>> +++ b/libdtrace/dt_prov_uprobe.c
>> @@ -735,7 +735,7 @@ static int provide_probe(dtrace_hdl_t *dtp, const pid_probespec_t *psp,
>> pd.id = DTRACE_IDNONE;
>> pd.prv = prv;
>> pd.mod = psp->pps_mod;
>> - pd.fun = psp->pps_fun;
>> + pd.fun = psp->pps_absoff ? "-" : psp->pps_fun;
>> pd.prb = prb;
>>
>> /* Get (or create) the provider for the PID of the probe. */
More information about the DTrace-devel
mailing list