Uprobe
uprobes 提供了用户级别的动态插桩, 它的接口类似于 kprobes , 但用于用户空间过程。 uprobes 可以检测用户级函数 enties 以及指令偏移量。另外 uretprobes 可以检测功能返回值。uprobes 也是基于文件的:跟踪可执行文件中的功能时,将检测使用该文件的所有进程,包括将来启动的进程。 这样就可以在系统范围内跟踪库调用。
Synopsis of uprobe_tracer
增加/删除event的命令格式:
|
|
在”fetch-args”中支持一系列的types,Kprobe tracer能够使用给定的type来存取内存。
-
‘s’ 、‘u’前缀:分别表明signed、unsigned;
-
‘x’前缀:意味着unsigned;
-
数字:十进制(‘s’ and ‘u’) ,16进制(‘x’)。没有类型固定,数字使用‘x32’还是‘x64’取决于架构(x86-32 uses x32, and x86-64 uses x64);
-
字符串:将会在内存中读取一个“null-terminated”的字符串。
-
Bitfield:有3个参数bit-width, bit- offset, container-size (usually 32).
1b<bit-width>@<bit-offset>/<container-size>1
对“$comm”,默认是“string”类型,其他类型非法。
Event Profiling
你可以通过/sys/kernel/debug/tracing/uprobe_profile查看所有kprobe event的命中和miss情况。第一列是event name,第二列是probe hits计数,第三列是probe miss-hits计数。
Usage examples
-
增加一个新的uprobe event,命令如下(在可执行文件/bin/bash的0x4245c0偏移处增加一个uprobe探针):
1echo 'p /bin/bash:0x4245c0' > /sys/kernel/debug/tracing/uprobe_events1 -
增加一个uretprobe event:
1echo 'r /bin/bash:0x4245c0' > /sys/kernel/debug/tracing/uprobe_events1 -
删除一个已注册的event:
echo '-:p_bash_0x4245c0' >> /sys/kernel/debug/tracing/uprobe_events1 -
打印出所有已注册的events:
1cat /sys/kernel/debug/tracing/uprobe_events1 -
清除掉所有的events:
1echo > /sys/kernel/debug/tracing/uprobe_events1
以下的例子展示怎么找到probe位置的地址,dump其instruction pointer 和 %ax register,探测/bin/zsh中的zfree函数:
|
|
0x46420是zfree在/bin/zsh中的偏移,/bin/zsh的内存加载地址为0x00400000。因此命令为:
|
|
同样的uretprobe为:
|
|
注意:用户必须明确的计算对象中的探测点的偏移量
我们可以看到已经注册的events:
|
|
可以从 events/uprobes/zfree_entry/format中查看event的输出格式:
|
|
定义以后,使能所有的events:
|
|
sleep以后,disable events:
|
|
还可以通过/sys/kernel/debug/tracing/trace文件查看trace信息:
|
|
输出显示给我们uprobe被触发时:pid 24842、ip 0x446420、ax register 79,uretprobe被触发时:ip at 0x446540从函数入口0x446420返回。
参考资料
-
No backlinks found.