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

 

 

 

目录
相关文章
|
开发工具 iOS开发 MacOS
解决VScode文件无法编辑(删除键 换行键失去作用)
解决VScode文件无法编辑(删除键 换行键失去作用)
4154 0
|
SQL JSON 关系型数据库
《理解MySQL数据库》版本演进全解析:从5.1到8.0的技术革新之路
MySQL从5.1到8.0历经多年演进,版本特性持续升级:5.1引入分区与事件调度,5.5确立InnoDB为默认引擎,5.6增强优化器与在线DDL,5.7支持JSON与多源复制,8.0则带来窗口函数、CTE、原子DDL等现代数据库能力。各版本性能与安全性不断提升,建议新项目采用8.0,存量系统逐步向8.0迁移,以获取更好的功能支持与长期维护保障。(239字)
|
缓存 网络协议 Unix
程序员超实用的文件系统性能评测工具盘点
程序员超实用的文件系统性能评测工具盘点
|
存储 安全 NoSQL
pthread_getspecific和pthread_setspecific详解
pthread_getspecific和pthread_setspecific详解
|
Linux 调度 数据库
Django使用django-apscheduler实现定时任务
【7月更文挑战第8天】定时任务可以在后台定时执行指定的代码,避免了很多人为操作。下面是在Django项目中如何使用定时任务的具体操作流程
1583 1
|
Python
联合概率 边缘概率 条件概率 贝叶斯定理
联合概率 边缘概率 条件概率 贝叶斯定理
781 0
|
弹性计算 Linux 编译器
CoreBolt——在倚天上基于 Coresight 做 BOLT 优化
CoreBolt 是一种倚天平台的性能优化解决方案。CoreBolt 通过 Coresight 在程序运行时采集程序运行信息,对程序的热代码和冷代码进行区分,并通过 BOLT 对程序进行代码段重排,从而提升程序代码的局部性,减少程序运行过程中由 CPU iCache miss 和 iTLB miss 引发的性能下降,提升程序的整体性能。
2189 6
|
监控 安全 计算机视觉
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
|
SQL 分布式计算 资源调度
一文看懂 Hive 优化大全(参数配置、语法优化)
以下是对提供的内容的摘要,总长度为240个字符: 在Hadoop集群中,服务器环境包括3台机器,分别运行不同的服务,如NodeManager、DataNode、NameNode等。集群组件版本包括jdk 1.8、mysql 5.7、hadoop 3.1.3和hive 3.1.2。文章讨论了YARN的配置优化,如`yarn.nodemanager.resource.memory-mb`、`yarn.nodemanager.vmem-check-enabled`和`hive.map.aggr`等参数,以及Map-Side聚合优化、Map Join和Bucket Map Join。
1673 0