(2010/08/24 18:56), Srikar Dronamraju wrote:
>>>
>>> 1000 [srikar@llm69 uprobesv3.git]$ cat
>>> /sys/kernel/debug/tracing/events/probe/do_fork/format
>>> name: do_fork
>>> ID: 817
>>> format:
>>> field:unsigned short common_type; offset:0; size:2; signed:0;
>>> field:unsigned char common_flags; offset:2; size:1; signed:0;
>>> field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
>>> field:int common_pid; offset:4; size:4; signed:1;
>>> field:int common_lock_depth; offset:8; size:4; signed:1;
>>>
>>> field:unsigned long __probe_ip; offset:16; size:8; signed:0;
>>> field:u64 %ip; offset:24; size:8; signed:0;
>>
>> Hmm, it could be caused by "u64"...
>> OK, maybe I should update perf to support those.
>>
>> BTW, let me check that you use perf for the latest kernel?
>>
>
>
> Yes, I am using perf from latest kernel and this happens on both x86
> and x86_64 boxes.
>
> Just for curiosity I tried printing the format for perf probe
> do_fork ip=%ip and here it is
>
> 1001 [srikar@llm69 uprobesv3.git]$ sudo perf probe do_fork ip=%ip
> 1001 [srikar@llm69 uprobesv3.git]$ cat /sys/kernel/debug/tracing/events/probe/do_fork/format
> name: do_fork
> ID: 818
> format:
> field:unsigned short common_type; offset:0; size:2; signed:0;
> field:unsigned char common_flags; offset:2; size:1; signed:0;
> field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
> field:int common_pid; offset:4; size:4; signed:1;
> field:int common_lock_depth; offset:8; size:4; signed:1;
>
> field:unsigned long __probe_ip; offset:16; size:8; signed:0;
> field:u64 ip; offset:24; size:8; signed:0;
> ^^
>
> print fmt: "(%lx) ip=%llx", REC->__probe_ip, REC->ip
> ^^ ^^
>
> The differences I see when a name is given we refer the name, while in
> the previous case we refer the register %ip.
Ah, I remembered that, yeah, perf doesn't support those raw regsiters,
dereferences, etc.
Hmm, this should be solved, but not so simple as just removing "%",
because there are also special variables ($retval, $stack) and
dereferences(+8(+10(%sp)), etc).
I think the simplest solution is just setting "argX" name for each
argument (if user omitted its name) in kprobe-tracer (because
trace-cmd will face same problem).
e.g.
# echo "p do_fork %ip" > tracing/kprobe_events
will be translated as below
# echo "p do_fork arg1=%ip" > tracing/kprobe_events
Thank you,
--
Masami HIRAMATSU
2nd Dept. Linux Technology Center
Hitachi, Ltd., Systems Development Laboratory
E-mail: [email protected]
> >
> > The differences I see when a name is given we refer the name, while in
> > the previous case we refer the register %ip.
>
> Ah, I remembered that, yeah, perf doesn't support those raw regsiters,
> dereferences, etc.
> Hmm, this should be solved, but not so simple as just removing "%",
> because there are also special variables ($retval, $stack) and
> dereferences(+8(+10(%sp)), etc).
>
> I think the simplest solution is just setting "argX" name for each
> argument (if user omitted its name) in kprobe-tracer (because
> trace-cmd will face same problem).
> e.g.
> # echo "p do_fork %ip" > tracing/kprobe_events
> will be translated as below
> # echo "p do_fork arg1=%ip" > tracing/kprobe_events
>
Okay, I will follow the same and fix the argX name in uprobe-tracer.
--
Thanks and Regards
Srikar