uprobetracer.txt 6.2 KB
Newer Older
A
Anton Arapov 已提交
1 2 3 4 5
            Uprobe-tracer: Uprobe-based Event Tracing
            =========================================

           Documentation written by Srikar Dronamraju

6 7 8 9

Overview
--------
Uprobe based trace events are similar to kprobe based trace events.
10
To enable this feature, build your kernel with CONFIG_UPROBE_EVENT=y.
11 12 13 14 15 16 17

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
A
Anton Arapov 已提交
18
user to calculate the offset of the probepoint in the object.
19 20 21

Synopsis of uprobe_tracer
-------------------------
22 23 24
  p[:[GRP/]EVENT] PATH:OFFSET [FETCHARGS] : Set a uprobe
  r[:[GRP/]EVENT] PATH:OFFSET [FETCHARGS] : Set a return uprobe (uretprobe)
  -:[GRP/]EVENT                           : Clear uprobe or uretprobe event
25

A
Anton Arapov 已提交
26 27
  GRP           : Group name. If omitted, "uprobes" is the default value.
  EVENT         : Event name. If omitted, the event name is generated based
28
                  on PATH+OFFSET.
A
Anton Arapov 已提交
29
  PATH          : Path to an executable or a library.
30
  OFFSET        : Offset where the probe is inserted.
31

A
Anton Arapov 已提交
32 33
  FETCHARGS     : Arguments. Each probe can have up to 128 args.
   %REG         : Fetch register REG
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
   @ADDR	: Fetch memory at ADDR (ADDR should be in userspace)
   $stackN	: Fetch Nth entry of stack (N >= 0)
   $stack	: Fetch stack address.
   $retval	: Fetch return value.(*)
   +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**)
   NAME=FETCHARG     : Set NAME as the argument name of FETCHARG.
   FETCHARG:TYPE     : Set TYPE as the type of FETCHARG. Currently, basic types
		       (u8/u16/u32/u64/s8/s16/s32/s64), "string" and bitfield
		       are supported.

  (*) only for return probe.
  (**) this is useful for fetching a field of data structures.

Types
-----
Several types are supported for fetch-args. Uprobe tracer will access memory
by given type. Prefix 's' and 'u' means those types are signed and unsigned
respectively. Traced arguments are shown in decimal (signed) or hex (unsigned).
String type is a special type, which fetches a "null-terminated" string from
user space.
Bitfield is another special type, which takes 3 parameters, bit-width, bit-
offset, and container-size (usually 32). The syntax is;

 b<bit-width>@<bit-offset>/<container-size>

59 60 61

Event Profiling
---------------
A
Anton Arapov 已提交
62
You can check the total number of probe hits and probe miss-hits via
63
/sys/kernel/debug/tracing/uprobe_profile.
A
Anton Arapov 已提交
64
The first column is event name, the second is the number of probe hits,
65 66 67 68
the third is the number of probe miss-hits.

Usage examples
--------------
A
Anton Arapov 已提交
69 70 71 72 73 74 75 76 77 78
 * Add a probe as a new uprobe event, write a new definition to uprobe_events
as below: (sets a uprobe at an offset of 0x4245c0 in the executable /bin/bash)

    echo 'p: /bin/bash:0x4245c0' > /sys/kernel/debug/tracing/uprobe_events

 * Add a probe as a new uretprobe event:

    echo 'r: /bin/bash:0x4245c0' > /sys/kernel/debug/tracing/uprobe_events

 * Unset registered event:
79

A
Anton Arapov 已提交
80
    echo '-:bash_0x4245c0' >> /sys/kernel/debug/tracing/uprobe_events
81

A
Anton Arapov 已提交
82
 * Print out the events that are registered:
83

A
Anton Arapov 已提交
84
    cat /sys/kernel/debug/tracing/uprobe_events
85

A
Anton Arapov 已提交
86
 * Clear all events:
87

A
Anton Arapov 已提交
88 89 90 91
    echo > /sys/kernel/debug/tracing/uprobe_events

Following example shows how to dump the instruction pointer and %ax register
at the probed text address. Probe zfree function in /bin/zsh:
92 93

    # cd /sys/kernel/debug/tracing/
A
Anton Arapov 已提交
94
    # cat /proc/`pgrep zsh`/maps | grep /bin/zsh | grep r-xp
95 96 97 98
    00400000-0048a000 r-xp 00000000 08:03 130904 /bin/zsh
    # objdump -T /bin/zsh | grep -w zfree
    0000000000446420 g    DF .text  0000000000000012  Base        zfree

A
Anton Arapov 已提交
99 100 101 102 103 104
  0x46420 is the offset of zfree in object /bin/zsh that is loaded at
  0x00400000. Hence the command to uprobe would be:

    # echo 'p:zfree_entry /bin/zsh:0x46420 %ip %ax' > uprobe_events

  And the same for the uretprobe would be:
105

A
Anton Arapov 已提交
106
    # echo 'r:zfree_exit /bin/zsh:0x46420 %ip %ax' >> uprobe_events
107

A
Anton Arapov 已提交
108
Please note: User has to explicitly calculate the offset of the probe-point
109 110 111 112
in the object. We can see the events that are registered by looking at the
uprobe_events file.

    # cat uprobe_events
A
Anton Arapov 已提交
113 114
    p:uprobes/zfree_entry /bin/zsh:0x00046420 arg1=%ip arg2=%ax
    r:uprobes/zfree_exit /bin/zsh:0x00046420 arg1=%ip arg2=%ax
115

A
Anton Arapov 已提交
116
Format of events can be seen by viewing the file events/uprobes/zfree_entry/format
117

A
Anton Arapov 已提交
118 119
    # cat events/uprobes/zfree_entry/format
    name: zfree_entry
120 121
    ID: 922
    format:
A
Anton Arapov 已提交
122 123 124 125 126
         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;
127

A
Anton Arapov 已提交
128 129 130
         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;
131 132

    print fmt: "(%lx) arg1=%lx arg2=%lx", REC->__probe_ip, REC->arg1, REC->arg2
133 134 135 136 137 138 139

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.
A
Anton Arapov 已提交
140

141 142 143 144 145 146 147 148 149 150
    # 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
    #              | |       |          |         |
A
Anton Arapov 已提交
151 152 153 154 155 156 157 158
                 zsh-24842 [006] 258544.995456: zfree_entry: (0x446420) arg1=446420 arg2=79
                 zsh-24842 [007] 258545.000270: zfree_exit:  (0x446540 <- 0x446420) arg1=446540 arg2=0
                 zsh-24842 [002] 258545.043929: zfree_entry: (0x446420) arg1=446420 arg2=79
                 zsh-24842 [004] 258547.046129: zfree_exit:  (0x446540 <- 0x446420) arg1=446540 arg2=0

Output shows us uprobe was triggered for a pid 24842 with ip being 0x446420
and contents of ax register being 79. And uretprobe was triggered with ip at
0x446540 with counterpart function entry at 0x446420.