-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tracing: Provide trace events interface for uprobes
Implements trace_event support for uprobes. In its current form it can be used to put probes at a specified offset in a file and dump the required registers when the code flow reaches the probed address. The following example shows how to dump the instruction pointer and %ax a register at the probed text address. Here we are trying to probe zfree in /bin/zsh: # cd /sys/kernel/debug/tracing/ # cat /proc/`pgrep zsh`/maps | grep /bin/zsh | grep r-xp 00400000-0048a000 r-xp 00000000 08:03 130904 /bin/zsh # objdump -T /bin/zsh | grep -w zfree 0000000000446420 g DF .text 0000000000000012 Base zfree # echo 'p /bin/zsh:0x46420 %ip %ax' > uprobe_events # cat uprobe_events p:uprobes/p_zsh_0x46420 /bin/zsh:0x0000000000046420 # echo 1 > events/uprobes/enable # sleep 20 # echo 0 > events/uprobes/enable # cat trace # tracer: nop # # TASK-PID CPU# TIMESTAMP FUNCTION # | | | | | zsh-24842 [006] 258544.995456: p_zsh_0x46420: (0x446420) arg1=446421 arg2=79 zsh-24842 [007] 258545.000270: p_zsh_0x46420: (0x446420) arg1=446421 arg2=79 zsh-24842 [002] 258545.043929: p_zsh_0x46420: (0x446420) arg1=446421 arg2=79 zsh-24842 [004] 258547.046129: p_zsh_0x46420: (0x446420) arg1=446421 arg2=79 Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Acked-by: Steven Rostedt <rostedt@goodmis.org> Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Cc: Jim Keniston <jkenisto@linux.vnet.ibm.com> Cc: Linux-mm <linux-mm@kvack.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: Christoph Hellwig <hch@infradead.org> Cc: Arnaldo Carvalho de Melo <acme@infradead.org> Cc: Anton Arapov <anton@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/20120411103043.GB29437@linux.vnet.ibm.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
- Loading branch information
Srikar Dronamraju
authored and
Ingo Molnar
committed
May 7, 2012
1 parent
8ab83f5
commit f3f096c
Showing
9 changed files
with
919 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
Uprobe-tracer: Uprobe-based Event Tracing | ||
========================================= | ||
Documentation written by Srikar Dronamraju | ||
|
||
Overview | ||
-------- | ||
Uprobe based trace events are similar to kprobe based trace events. | ||
To enable this feature, build your kernel with CONFIG_UPROBE_EVENTS=y. | ||
|
||
Similar to the kprobe-event tracer, this doesn't need to be activated via | ||
current_tracer. Instead of that, add probe points via | ||
/sys/kernel/debug/tracing/uprobe_events, and enable it via | ||
/sys/kernel/debug/tracing/events/uprobes/<EVENT>/enabled. | ||
|
||
However unlike kprobe-event tracer, the uprobe event interface expects the | ||
user to calculate the offset of the probepoint in the object | ||
|
||
Synopsis of uprobe_tracer | ||
------------------------- | ||
p[:[GRP/]EVENT] PATH:SYMBOL[+offs] [FETCHARGS] : Set a probe | ||
|
||
GRP : Group name. If omitted, use "uprobes" for it. | ||
EVENT : Event name. If omitted, the event name is generated | ||
based on SYMBOL+offs. | ||
PATH : path to an executable or a library. | ||
SYMBOL[+offs] : Symbol+offset where the probe is inserted. | ||
|
||
FETCHARGS : Arguments. Each probe can have up to 128 args. | ||
%REG : Fetch register REG | ||
|
||
Event Profiling | ||
--------------- | ||
You can check the total number of probe hits and probe miss-hits via | ||
/sys/kernel/debug/tracing/uprobe_profile. | ||
The first column is event name, the second is the number of probe hits, | ||
the third is the number of probe miss-hits. | ||
|
||
Usage examples | ||
-------------- | ||
To add a probe as a new event, write a new definition to uprobe_events | ||
as below. | ||
|
||
echo 'p: /bin/bash:0x4245c0' > /sys/kernel/debug/tracing/uprobe_events | ||
|
||
This sets a uprobe at an offset of 0x4245c0 in the executable /bin/bash | ||
|
||
echo > /sys/kernel/debug/tracing/uprobe_events | ||
|
||
This clears all probe points. | ||
|
||
The following example shows how to dump the instruction pointer and %ax | ||
a register at the probed text address. Here we are trying to probe | ||
function zfree in /bin/zsh | ||
|
||
# cd /sys/kernel/debug/tracing/ | ||
# cat /proc/`pgrep zsh`/maps | grep /bin/zsh | grep r-xp | ||
00400000-0048a000 r-xp 00000000 08:03 130904 /bin/zsh | ||
# objdump -T /bin/zsh | grep -w zfree | ||
0000000000446420 g DF .text 0000000000000012 Base zfree | ||
|
||
0x46420 is the offset of zfree in object /bin/zsh that is loaded at | ||
0x00400000. Hence the command to probe would be : | ||
|
||
# echo 'p /bin/zsh:0x46420 %ip %ax' > uprobe_events | ||
|
||
Please note: User has to explicitly calculate the offset of the probepoint | ||
in the object. We can see the events that are registered by looking at the | ||
uprobe_events file. | ||
|
||
# cat uprobe_events | ||
p:uprobes/p_zsh_0x46420 /bin/zsh:0x0000000000046420 | ||
|
||
Right after definition, each event is disabled by default. For tracing these | ||
events, you need to enable it by: | ||
|
||
# echo 1 > events/uprobes/enable | ||
|
||
Lets disable the event after sleeping for some time. | ||
# sleep 20 | ||
# echo 0 > events/uprobes/enable | ||
|
||
And you can see the traced information via /sys/kernel/debug/tracing/trace. | ||
|
||
# cat trace | ||
# tracer: nop | ||
# | ||
# TASK-PID CPU# TIMESTAMP FUNCTION | ||
# | | | | | | ||
zsh-24842 [006] 258544.995456: p_zsh_0x46420: (0x446420) arg1=446421 arg2=79 | ||
zsh-24842 [007] 258545.000270: p_zsh_0x46420: (0x446420) arg1=446421 arg2=79 | ||
zsh-24842 [002] 258545.043929: p_zsh_0x46420: (0x446420) arg1=446421 arg2=79 | ||
zsh-24842 [004] 258547.046129: p_zsh_0x46420: (0x446420) arg1=446421 arg2=79 | ||
|
||
Each line shows us probes were triggered for a pid 24842 with ip being | ||
0x446421 and contents of ax register being 79. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.