1========================================= 2Uprobe-tracer: Uprobe-based Event Tracing 3========================================= 4 5:Author: Srikar Dronamraju 6 7 8Overview 9-------- 10Uprobe based trace events are similar to kprobe based trace events. 11To enable this feature, build your kernel with CONFIG_UPROBE_EVENTS=y. 12 13Similar to the kprobe-event tracer, this doesn't need to be activated via 14current_tracer. Instead of that, add probe points via 15/sys/kernel/debug/tracing/uprobe_events, and enable it via 16/sys/kernel/debug/tracing/events/uprobes/<EVENT>/enable. 17 18However unlike kprobe-event tracer, the uprobe event interface expects the 19user to calculate the offset of the probepoint in the object. 20 21You can also use /sys/kernel/debug/tracing/dynamic_events instead of 22uprobe_events. That interface will provide unified access to other 23dynamic events too. 24 25Synopsis of uprobe_tracer 26------------------------- 27:: 28 29 p[:[GRP/]EVENT] PATH:OFFSET [FETCHARGS] : Set a uprobe 30 r[:[GRP/]EVENT] PATH:OFFSET [FETCHARGS] : Set a return uprobe (uretprobe) 31 -:[GRP/]EVENT : Clear uprobe or uretprobe event 32 33 GRP : Group name. If omitted, "uprobes" is the default value. 34 EVENT : Event name. If omitted, the event name is generated based 35 on PATH+OFFSET. 36 PATH : Path to an executable or a library. 37 OFFSET : Offset where the probe is inserted. 38 39 FETCHARGS : Arguments. Each probe can have up to 128 args. 40 %REG : Fetch register REG 41 @ADDR : Fetch memory at ADDR (ADDR should be in userspace) 42 @+OFFSET : Fetch memory at OFFSET (OFFSET from same file as PATH) 43 $stackN : Fetch Nth entry of stack (N >= 0) 44 $stack : Fetch stack address. 45 $retval : Fetch return value.(*) 46 $comm : Fetch current task comm. 47 +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) 48 NAME=FETCHARG : Set NAME as the argument name of FETCHARG. 49 FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types 50 (u8/u16/u32/u64/s8/s16/s32/s64), hexadecimal types 51 (x8/x16/x32/x64), "string" and bitfield are supported. 52 53 (*) only for return probe. 54 (**) this is useful for fetching a field of data structures. 55 56Types 57----- 58Several types are supported for fetch-args. Uprobe tracer will access memory 59by given type. Prefix 's' and 'u' means those types are signed and unsigned 60respectively. 'x' prefix implies it is unsigned. Traced arguments are shown 61in decimal ('s' and 'u') or hexadecimal ('x'). Without type casting, 'x32' 62or 'x64' is used depends on the architecture (e.g. x86-32 uses x32, and 63x86-64 uses x64). 64String type is a special type, which fetches a "null-terminated" string from 65user space. 66Bitfield is another special type, which takes 3 parameters, bit-width, bit- 67offset, and container-size (usually 32). The syntax is:: 68 69 b<bit-width>@<bit-offset>/<container-size> 70 71For $comm, the default type is "string"; any other type is invalid. 72 73 74Event Profiling 75--------------- 76You can check the total number of probe hits and probe miss-hits via 77/sys/kernel/debug/tracing/uprobe_profile. 78The first column is event name, the second is the number of probe hits, 79the third is the number of probe miss-hits. 80 81Usage examples 82-------------- 83 * Add a probe as a new uprobe event, write a new definition to uprobe_events 84 as below (sets a uprobe at an offset of 0x4245c0 in the executable /bin/bash):: 85 86 echo 'p /bin/bash:0x4245c0' > /sys/kernel/debug/tracing/uprobe_events 87 88 * Add a probe as a new uretprobe event:: 89 90 echo 'r /bin/bash:0x4245c0' > /sys/kernel/debug/tracing/uprobe_events 91 92 * Unset registered event:: 93 94 echo '-:p_bash_0x4245c0' >> /sys/kernel/debug/tracing/uprobe_events 95 96 * Print out the events that are registered:: 97 98 cat /sys/kernel/debug/tracing/uprobe_events 99 100 * Clear all events:: 101 102 echo > /sys/kernel/debug/tracing/uprobe_events 103 104Following example shows how to dump the instruction pointer and %ax register 105at the probed text address. Probe zfree function in /bin/zsh:: 106 107 # cd /sys/kernel/debug/tracing/ 108 # cat /proc/`pgrep zsh`/maps | grep /bin/zsh | grep r-xp 109 00400000-0048a000 r-xp 00000000 08:03 130904 /bin/zsh 110 # objdump -T /bin/zsh | grep -w zfree 111 0000000000446420 g DF .text 0000000000000012 Base zfree 112 1130x46420 is the offset of zfree in object /bin/zsh that is loaded at 1140x00400000. Hence the command to uprobe would be:: 115 116 # echo 'p:zfree_entry /bin/zsh:0x46420 %ip %ax' > uprobe_events 117 118And the same for the uretprobe would be:: 119 120 # echo 'r:zfree_exit /bin/zsh:0x46420 %ip %ax' >> uprobe_events 121 122.. note:: User has to explicitly calculate the offset of the probe-point 123 in the object. 124 125We can see the events that are registered by looking at the uprobe_events file. 126:: 127 128 # cat uprobe_events 129 p:uprobes/zfree_entry /bin/zsh:0x00046420 arg1=%ip arg2=%ax 130 r:uprobes/zfree_exit /bin/zsh:0x00046420 arg1=%ip arg2=%ax 131 132Format of events can be seen by viewing the file events/uprobes/zfree_entry/format. 133:: 134 135 # cat events/uprobes/zfree_entry/format 136 name: zfree_entry 137 ID: 922 138 format: 139 field:unsigned short common_type; offset:0; size:2; signed:0; 140 field:unsigned char common_flags; offset:2; size:1; signed:0; 141 field:unsigned char common_preempt_count; offset:3; size:1; signed:0; 142 field:int common_pid; offset:4; size:4; signed:1; 143 field:int common_padding; offset:8; size:4; signed:1; 144 145 field:unsigned long __probe_ip; offset:12; size:4; signed:0; 146 field:u32 arg1; offset:16; size:4; signed:0; 147 field:u32 arg2; offset:20; size:4; signed:0; 148 149 print fmt: "(%lx) arg1=%lx arg2=%lx", REC->__probe_ip, REC->arg1, REC->arg2 150 151Right after definition, each event is disabled by default. For tracing these 152events, you need to enable it by:: 153 154 # echo 1 > events/uprobes/enable 155 156Lets disable the event after sleeping for some time. 157:: 158 159 # sleep 20 160 # echo 0 > events/uprobes/enable 161 162And you can see the traced information via /sys/kernel/debug/tracing/trace. 163:: 164 165 # cat trace 166 # tracer: nop 167 # 168 # TASK-PID CPU# TIMESTAMP FUNCTION 169 # | | | | | 170 zsh-24842 [006] 258544.995456: zfree_entry: (0x446420) arg1=446420 arg2=79 171 zsh-24842 [007] 258545.000270: zfree_exit: (0x446540 <- 0x446420) arg1=446540 arg2=0 172 zsh-24842 [002] 258545.043929: zfree_entry: (0x446420) arg1=446420 arg2=79 173 zsh-24842 [004] 258547.046129: zfree_exit: (0x446540 <- 0x446420) arg1=446540 arg2=0 174 175Output shows us uprobe was triggered for a pid 24842 with ip being 0x446420 176and contents of ax register being 79. And uretprobe was triggered with ip at 1770x446540 with counterpart function entry at 0x446420. 178