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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java杂记9—NIO
前言 非阻塞IO,也被称之为新IO,它重新定义了一些概念。 缓冲buffer 通道 channel 通道选择器 BIO 阻塞IO,几乎所有的java程序员都会的字节流,字符流,输入流,输出流等分类就是针对BIO而言的。我们在使用BIO的时候都是建立基本的节点流然后用过滤流进行包装。 不同于BIO,NIO所有的IO操作都是通过通道读写buffer完成的。数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 通道 NIO的通道类似流,但是有所不同。 既可以从通道中读取数据,又可以写数据到通道。而流的读写通常是单向的 通道就是类似与高速路,数据通过buffer传递。通道负责从buffer中读,或者写入buffer 通道可以异步读写 FileChannel 从文件中读写数据 DatagramChannel 能通过UDP读写网络中的数据 SocketChannel 能通过TCP读写网络中的数据 ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel Buffer Buffer 用来缓存数据,NIO中所有...
- 下一篇
关于图文识别功能相关技术的大致实现
关于图文识别功能相关技术的实现 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/8908906.html 上一章,写的是SSL证书配置,中间折腾了好一会,在此感谢SSL证书发行商的协助;这次我就讲讲ocr识别的问题,先说说需求来源吧。。。 之前因为风控每次需要手动P协议文件和身份证(脱敏),还要识别证件及图片文件的内容,觉得狠狠狠麻烦,遂就找到了技术总监,技术总监一拍脑袋,额,小邹啊。。。 呃,一开始并没抱太大希望,不过还是花了些心思做了些需求实现的调研,怎么办 google、duckduckgo、github一路找下来就有了几个工程了,嘿嘿~,可惜还没高兴到,没想到的是这些工程一个比一个坑,不是依赖windows系统组件就是代码bug不断,作者们,能用点儿心么 日夜操劳,加班啊,总算是将几个工程全都修得能跑起来了,大费周折。。。难得啊 欸,可惜效果均不佳;现开始,我总结下一些主流的图文识别技术,只是浅聊哦。。。 首先,这些工程大致分两类: 一类是纯算法,不附带机器学习功能的,且需要依赖于window系统组件的工程,比如tesseract和tes...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度