On Thu, 21 Mar 2024 10:15:47 -0400
Steven Rostedt <rost...@goodmis.org> wrote:

> On Wed, 20 Mar 2024 21:29:20 +0800
> Ye Bin <yebi...@huawei.com> wrote:
> 
> > Support print type '%pd' for print dentry's  name.
> > 
> 
> The above is not a very detailed change log. A change log should state not
> only what the change is doing, but also why.
> 
> Having examples of before and after would be useful in the change log.

Hm, OK. Ye, something like this.
-----
Support print type '%pd' for print dentry's name. For example "name=$arg1:%pd"
casts the `$arg1` as (struct dentry *), dereferences the "d_name.name" field
and stores it to "name" argument as a kernel string. Here is an example;

echo 'p:testprobe dput name=$arg1:%pd' > kprobe_events 
echo 1 > events/kprobes/testprobe/enable 
cat trace
...
              sh-132     [004] .....   333.333051: testprobe: (dput+0x4/0x20) 
name="enable"


Note that this expects the given argument (e.g. $arg1) is an address of struct
dentry. User must ensure it.
-----

And add similar changelog on [2/5]. 

Thank you,

> 
> > Signed-off-by: Ye Bin <yebi...@huawei.com>
> > ---
> >  kernel/trace/trace.c        |  2 +-
> >  kernel/trace/trace_fprobe.c |  6 +++++
> >  kernel/trace/trace_kprobe.c |  6 +++++
> >  kernel/trace/trace_probe.c  | 50 +++++++++++++++++++++++++++++++++++++
> >  kernel/trace/trace_probe.h  |  2 ++
> >  5 files changed, 65 insertions(+), 1 deletion(-)
> > 
> > diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
> > index b12f8384a36a..ac26b8446337 100644
> > --- a/kernel/trace/trace.c
> > +++ b/kernel/trace/trace.c
> 
> 
> > +/* @buf: *buf must be equal to NULL. Caller must to free *buf */
> > +int traceprobe_expand_dentry_args(int argc, const char *argv[], char **buf)
> > +{
> > +   int i, used, ret;
> > +   const int bufsize = MAX_DENTRY_ARGS_LEN;
> > +   char *tmpbuf = NULL;
> > +
> > +   if (*buf)
> > +           return -EINVAL;
> > +
> > +   used = 0;
> > +   for (i = 0; i < argc; i++) {
> > +           if (glob_match("*:%pd", argv[i])) {
> > +                   char *tmp;
> > +                   char *equal;
> > +
> > +                   if (!tmpbuf) {
> > +                           tmpbuf = kmalloc(bufsize, GFP_KERNEL);
> > +                           if (!tmpbuf)
> > +                                   return -ENOMEM;
> > +                   }
> > +
> > +                   tmp = kstrdup(argv[i], GFP_KERNEL);
> > +                   if (!tmp)
> > +                           goto nomem;
> > +
> > +                   equal = strchr(tmp, '=');
> > +                   if (equal)
> > +                           *equal = '\0';
> > +                   tmp[strlen(argv[i]) - 4] = '\0';
> > +                   ret = snprintf(tmpbuf + used, bufsize - used,
> > +                                  "%s%s+0x0(+0x%zx(%s)):string",
> > +                                  equal ? tmp : "", equal ? "=" : "",
> > +                                  offsetof(struct dentry, d_name.name),
> > +                                  equal ? equal + 1 : tmp);
> 
> What would be really useful is if we had a way to expose BTF here. Something 
> like:
> 
>  "%pB:<struct>:<field>"
> 
> The "%pB" would mean to look up the struct/field offsets and types via BTF,
> and create the appropriate command to find and print it.

Would you mean casing the pointer to "<struct>"?


> 
> That would be much more flexible and useful as it would allow reading any
> field from any structure without having to use gdb.
> 
> -- Steve
> 
> 
> > +                   kfree(tmp);
> > +                   if (ret >= bufsize - used)
> > +                           goto nomem;
> > +                   argv[i] = tmpbuf + used;
> > +                   used += ret + 1;
> > +           }
> > +   }
> > +
> > +   *buf = tmpbuf;
> > +   return 0;
> > +nomem:
> > +   kfree(tmpbuf);
> > +   return -ENOMEM;
> > +}
> 


-- 
Masami Hiramatsu (Google) <mhira...@kernel.org>

Reply via email to