场景
对于工程实践中需要查看某些ioctl是否被调用,尤其是一个新的模块初次调试,在不添加调试命令debug的情况下如何观测?
另外就是对于外部提供的二进制程序,如何观测该程序是否调用ioctl以及何时调用?
这些都通过ebpf能够良好的观测。尤其是bpftrace可以类似脚本级别的快速查看
一条命令
bfptrace -e "tracepoint:syscalls:sys_enter_ioctl { if (comm == \"yourcmd\" {printf (" pid[%d]: %s ioctl called, with fd:%d\n", pid, comm, args->fd);}}
pid 是打印执行进程的pid
comm是执行进程的名字
args是参数,fd是文件id
通过if 进行过滤判断执行命令按照要求过滤的,不然可能打印很多
脚本形式
bpftrace 1.bt
# cat 1.bt
#!/usr/bin/env bpftrace
tracepoint:syscalls:sys_enter_ioctl
{
if (comm == "yourcmd" {
printf (" pid[%d]: %s ioctl called, with fd:%d\n", pid, comm, args->fd);
}
}
注意:
- 在bt中不要使用#注释
- 第一行要指定执行脚本
实操
待补充。
实际执行后,命令行会pending等待,当执行相关命令进行ioctl的时候会打印途中printf部分的内容。包括pid 名字 fd等。
其他
如果没有安装bpftrace参考兄弟篇文章:https://blog.csdn.net/essencelite/article/details/138550516