eBPF监控工具bcc系列三自定义工具trace


上篇中是通用的直接可用工具。

  trace工具可以指定跟踪函数并显示,可控制其输出格式来显示函数参数和返回值。

例如跟踪文件拥有者的属性更改,也就是跟踪三个文件系统调用chown,fchown,lchown。使用如下:

trace.py    'p::SyS_chown "file = %s, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid'    'p::SyS_fchown "fd = %d, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid'    'p::SyS_lchown "file = %s, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid'

例如跟踪非主动上下文切换。

trace.py -p 1134138 't:sched:sched_switch (args->prev_state == TASK_STATE_MAX || args->prev_state == 0)'

跟踪系统中所有exec调用

# trace 'sys_execve "%s", arg1'

其中sys_execve是内核函数,%s表示打印字符串,这个被复制为arg1就是程序的入参。

例如跟踪系统读操作read,所读大小大于20000(这个参数可以通过man read查看是在第三个位置上),所以跟踪函数如下:

trace 'sys_read (arg3 > 20000) "read %d bytes", arg3'

还可以跟踪用户层函数,例如跟踪bash上readline脚本,并输出返回值,可以如下书写

trace 'r:bash:readline "%s", retval'

其中r表示retprobe是返回探针。

跟踪读写失败的命令

trace 'r:c:read ((int)retval < 0) "read failed: %d", retval' 'r:c:write ((int)retval < 0) "write failed: %d", retval' -T

1.   内核tracepoints

还可以跟踪内核的tracepoints,例如跟踪block:block_rq_complete的tracepoint,并打印多少扇区被传输。

trace 't:block:block_rq_complete "sectors=%d", args->nr_sector' -T

如果不清楚跟踪点的数据结构格式,可以使用tplist工具来获得,例如

tplist -v block:block_rq_complete

得到数据结构后就可以用做参数来获取nr_sector了。

2.   第三方库

越来越多高级库支持探针,就像内核tracepoint一样可以用来被跟踪。

例如跟踪pthread_create函数

trace 'u:pthread:pthread_create "%U", arg3' -T -C

            其中%U表示将arg3解析成用户层符号。同样,内核的是%K.

            现在Ruby,Node,OpenJDK都支持。

跟踪ruby示例:

trace 'u:ruby:method__entry "%s.%s", arg1, arg2' -p $(pidof irb) -T

跟踪共享库函数如下:

trace.py 'r:/usr/lib64/libtinfo.so:curses_version "Version=%s", retval'

 

3.   高级过滤

跟踪open,同时指出其打开的文件名字为test.txt

trace 'p:c:open (STRCMP("test.txt", arg1)) "opening %s", arg1' -T

trace 'p::SyS_nanosleep(struct timespec *ts) "sleep for %lld ns", ts->tv_nsec'

跟踪指定进程的指定函数,使用-p参数,如下:

trace -p 2740 'do_sys_open "%s", arg2' -T

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
eBPF python是一个框架,允许用户编写使用eBPF程序嵌入其中的Python程序。这个框架主要用于应用程序和系统分析/跟踪的场景,其中eBPF程序用于收集统计信息或生成事件,而用户空间中的对应部分则负责收集数据并以人类可读的形式进行显示。运行Python程序会生成eBPF字节码并将其加载到内核中。 在Python中使用eBPF的高级封装BCC来开发eBPF程序的步骤如下: 1. 首先,通过导入BCC库来使用它提供的功能。 2. 使用BPF类加载eBPF程序。 3. 使用attach_kprobe方法将BPF程序挂载到内核的探针上。 4. 使用trace_print方法读取内核调试文件的内容并打印到标准输出中。 在另一个例子中,也是使用BCC库来开发eBPF程序的步骤如下: 1. 导入BCC库。 2. 加载eBPF程序。 3. 使用attach_kprobe方法将BPF程序挂载到内核的探针上。 4. 使用trace_print方法读取内核调试文件的内容并打印到标准输出中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [eBPF学习笔记(二)—— eBPF开发工具](https://blog.csdn.net/qq_41988448/article/details/127813132)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [eBPF学习 - 入门](https://blog.csdn.net/hzb869168467/article/details/124239015)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值