-
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.
- Loading branch information
Ingo Molnar
committed
May 14, 2012
1 parent
5089d5a
commit 7f6f078
Showing
25 changed files
with
4,602 additions
and
879 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 |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 73eff9f56e15598c8399c0b86899fd889b97f085 | ||
refs/heads/master: 9cba26e66d09bf394ae5a739627a1dc8b7cae6f4 |
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,113 @@ | ||
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_EVENT=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:0x00046420 arg1=%ip arg2=%ax | ||
|
||
The format of events can be seen by viewing the file events/uprobes/p_zsh_0x46420/format | ||
|
||
# cat events/uprobes/p_zsh_0x46420/format | ||
name: p_zsh_0x46420 | ||
ID: 922 | ||
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_padding; offset:8; size:4; signed:1; | ||
|
||
field:unsigned long __probe_ip; offset:12; size:4; signed:0; | ||
field:u32 arg1; offset:16; size:4; signed:0; | ||
field:u32 arg2; offset:20; size:4; signed:0; | ||
|
||
print fmt: "(%lx) arg1=%lx arg2=%lx", REC->__probe_ip, REC->arg1, REC->arg2 | ||
|
||
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
#ifndef _ASM_UPROBES_H | ||
#define _ASM_UPROBES_H | ||
/* | ||
* User-space Probes (UProbes) for x86 | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
* | ||
* Copyright (C) IBM Corporation, 2008-2011 | ||
* Authors: | ||
* Srikar Dronamraju | ||
* Jim Keniston | ||
*/ | ||
|
||
#include <linux/notifier.h> | ||
|
||
typedef u8 uprobe_opcode_t; | ||
|
||
#define MAX_UINSN_BYTES 16 | ||
#define UPROBE_XOL_SLOT_BYTES 128 /* to keep it cache aligned */ | ||
|
||
#define UPROBE_SWBP_INSN 0xcc | ||
#define UPROBE_SWBP_INSN_SIZE 1 | ||
|
||
struct arch_uprobe { | ||
u16 fixups; | ||
u8 insn[MAX_UINSN_BYTES]; | ||
#ifdef CONFIG_X86_64 | ||
unsigned long rip_rela_target_address; | ||
#endif | ||
}; | ||
|
||
struct arch_uprobe_task { | ||
unsigned long saved_trap_nr; | ||
#ifdef CONFIG_X86_64 | ||
unsigned long saved_scratch_register; | ||
#endif | ||
}; | ||
|
||
extern int arch_uprobe_analyze_insn(struct arch_uprobe *aup, struct mm_struct *mm); | ||
extern int arch_uprobe_pre_xol(struct arch_uprobe *aup, struct pt_regs *regs); | ||
extern int arch_uprobe_post_xol(struct arch_uprobe *aup, struct pt_regs *regs); | ||
extern bool arch_uprobe_xol_was_trapped(struct task_struct *tsk); | ||
extern int arch_uprobe_exception_notify(struct notifier_block *self, unsigned long val, void *data); | ||
extern void arch_uprobe_abort_xol(struct arch_uprobe *aup, struct pt_regs *regs); | ||
#endif /* _ASM_UPROBES_H */ |
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.