lkml.org 
[lkml]   [2010]   [Aug]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: Using perf probe with arguments throws a fatal error.
(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: masami.hiramatsu.pt@hitachi.com


\
 
 \ /
  Last update: 2010-08-25 07:51    [W:0.039 / U:0.144 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site