iovisor/bcc
GitHub: iovisor/bcc
BCC 是基于 eBPF 的 Linux 内核追踪工具包,提供丰富的开箱即用工具,让开发者能够低开销地进行系统性能分析和故障诊断。
Stars: 22317 | Forks: 4041

# BPF Compiler Collection (BCC)
BCC 是一个用于创建高效内核跟踪和操作程序的工具包,其中包含 several useful tools and examples。它利用了扩展 BPF (Berkeley Packet Filters),正式名称为 eBPF,这是 Linux 3.15 中首次添加的新功能。BCC 使用的大部分功能需要 Linux 4.1 及更高版本。
eBPF 曾被 Ingo Molnár [描述为](https://lkml.org/lkml/2015/4/14/232):
BCC 使 BPF 程序更易于编写,支持使用 C 进行内核检测(并包含一个围绕 LLVM 的 C 封装器),以及 Python 和 lua 的前端。它适用于许多任务,包括性能分析和网络流量控制。
## 截图
此示例跟踪磁盘 I/O 内核函数,并在内核中填充一个 I/O 大小的 2 的幂次直方图。为了提高效率,仅将直方图摘要返回到用户级别。
```
# ./bitehist.py
Tracing... Hit Ctrl-C to end.
^C
kbytes : count distribution
0 -> 1 : 3 | |
2 -> 3 : 0 | |
4 -> 7 : 211 |********** |
8 -> 15 : 0 | |
16 -> 31 : 0 | |
32 -> 63 : 0 | |
64 -> 127 : 1 | |
128 -> 255 : 800 |**************************************|
```
上面的输出显示了一个双峰分布,其中最大的模式是 800 I/O,大小在 128 到 255 Kbytes 之间。
查看源码:[bitehist.py](examples/tracing/bitehist.py)。它跟踪什么、存储什么以及如何展示数据,都可以完全自定义。这仅展示了众多可能功能中的一部分。
## 安装
有关您平台上的安装步骤,请参阅 [INSTALL.md](INSTALL.md)。
## 常见问题
有关最常见的故障排除问题,请参阅 [FAQ.txt](FAQ.txt)。
## 参考指南
有关 bcc 和 bcc/BPF API 的参考指南,请参阅 [docs/reference_guide.md](docs/reference_guide.md)。
## 目录
其中一些是同时包含 C 和 Python 的单文件,另一些则包含一对 .c 和 .py 文件,还有一些是文件目录。
### 跟踪
#### 示例
- examples/tracing/[bitehist.py](examples/tracing/bitehist.py): 块 I/O 大小直方图。[示例](examples/tracing/bitehist_example.txt)。
- examples/tracing/[disksnoop.py](examples/tracing/disksnoop.py): 跟踪块设备 I/O 延迟。[示例](examples/tracing/disksnoop_example.txt)。
- examples/[hello_world.py](examples/hello_world.py): 为新进程打印 "Hello, World!"。
- examples/tracing/[mysqld_query.py](examples/tracing/mysqld_query.py): 使用 USDT 探针跟踪 MySQL 服务器查询。[示例](examples/tracing/mysqld_query_example.txt)。
- examples/tracing/[nodejs_http_server.py](examples/tracing/nodejs_http_server.py): 使用 USDT 探针跟踪 Node.js HTTP 服务器请求。[示例](examples/tracing/nodejs_http_server_example.txt)。
- examples/tracing/[stacksnoop](examples/tracing/stacksnoop.py): 跟踪内核函数并打印所有内核堆栈跟踪。[示例](examples/tracing/stacksnoop_example.txt)。
- tools/[statsnoop](tools/statsnoop.py): 跟踪 stat() 系统调用。[示例](tools/statsnoop_example.txt)。
- examples/tracing/[task_switch.py](examples/tracing/task_switch.py): 计算带有来自和去往 PID 的任务切换次数。
- examples/tracing/[tcpv4connect.py](examples/tracing/tcpv4connect.py): 跟踪 TCP IPv4 主动连接。[示例](examples/tracing/tcpv4connect_example.txt)。
- examples/tracing/[trace_fields.py](examples/tracing/trace_fields.py): 打印来自跟踪事件的字段的简单示例。
- examples/tracing/[undump.py](examples/tracing/undump.py): 转储 UNIX 套接字数据包。[示例](examples/tracing/undump_example.txt)
- examples/tracing/[urandomread.py](examples/tracing/urandomread.py): 一个内核跟踪点示例,跟踪 random:urandom_read。[示例](examples/tracing/urandomread_example.txt)。
- examples/tracing/[vfsreadlat.py](examples/tracing/vfsreadlat.py) examples/tracing/[vfsreadlat.c](examples/tracing/vfsreadlat.c): VFS 读取延迟分布。[示例](examples/tracing/vfsreadlat_example.txt)。
- examples/tracing/[kvm_hypercall.py](examples/tracing/kvm_hypercall.py): 用于 KVM 进入、退出和超调用的条件静态内核跟踪点 [示例](examples/tracing/kvm_hypercall.txt)。
#### 工具

- tools/[argdist](tools/argdist.py): 以直方图或频率计数的形式显示函数参数值。[示例](tools/argdist_example.txt)。
- tools/[bashreadline](tools/bashreadline.py): 打印系统范围内输入的 bash 命令。[示例](tools/bashreadline_example.txt)。
- tools/[bpflist](tools/bpflist.py): 显示具有活动 BPF 程序和映射的进程。[示例](tools/bpflist_example.txt)。
- tools/[capable](tools/capable.py): 跟踪安全能力检查。[示例](tools/capable_example.txt)。
- tools/[compactsnoop](tools/compactsnoop.py): 跟踪带有 PID 和延迟的压缩区域事件。[示例](tools/compactsnoop_example.txt)。
- tools/[criticalstat](tools/criticalstat.py): 跟踪并报告内核中长时间的原子临界区。[示例](tools/criticalstat_example.txt)
- tools/[deadlock](tools/deadlock.py): 检测正在运行的进程中潜在的死锁。[示例](tools/deadlock_example.txt)。
- tools/[drsnoop](tools/drsnoop.py): 跟踪带有 PID 和延迟的直接回收事件。[示例](tools/drsnoop_example.txt)。
- tools/[funccount](tools/funccount.py): 计算内核函数调用次数。[示例](tools/funccount_example.txt)。
- tools/[inject](tools/inject.py): 带有调用链和谓词的目标错误注入 [示例](tools/inject_example.txt)。
- tools/[klockstat](tools/klockstat.py): 跟踪内核互斥锁事件并显示锁统计信息。[示例](tools/klockstat_example.txt)。
- tools/[opensnoop](tools/opensnoop.py): 跟踪 open() 系统调用。[示例](tools/opensnoop_example.txt)。
- tools/[readahead](tools/readahead.py): 显示预读缓存的性能 [示例](tools/readahead_example.txt)。
- tools/[reset-trace](tools/reset-trace.sh): 重置跟踪状态。仅限维护工具。[示例](tools/reset-trace_example.txt)。
- tools/[stackcount](tools/stackcount.py): 计算内核函数调用及其堆栈跟踪。[示例](tools/stackcount_example.txt)。
- tools/[syncsnoop](tools/syncsnoop.py): 跟踪 sync() 系统调用。[示例](tools/syncsnoop_example.txt)。
- tools/[threadsnoop](tools/threadsnoop.py): 列出新线程的创建。[示例](tools/threadsnoop_example.txt)。
- tools/[tplist](tools/tplist.py): 显示内核跟踪点或 USDT 探针及其格式。[示例](tools/tplist_example.txt)。
- tools/[trace](tools/trace.py): 跟踪任意函数,支持过滤器。[示例](tools/trace_example.txt)。
- tools/[ttysnoop](tools/ttysnoop.py): 查看来自 tty 或 pts 设备的实时输出。[示例](tools/ttysnoop_example.txt)。
- tools/[ucalls](tools/lib/ucalls.py): 汇总高级语言中的方法调用或 Linux 系统调用。[示例](tools/lib/ucalls_example.txt)。
- tools/[uflow](tools/lib/uflow.py): 在高级语言中打印方法流图。[示例](tools/lib/uflow_example.txt)。
- tools/[ugc](tools/lib/ugc.py): 跟踪高级语言中的垃圾回收事件。[示例](tools/lib/ugc_example.txt)。
- tools/[uobjnew](tools/lib/uobjnew.py): 按对象类型和分配的字节数汇总对象分配事件。[示例](tools/lib/uobjnew_example.txt)。
- tools/[ustat](tools/lib/ustat.py): 收集高级语言中的 GC、线程创建、对象分配、异常等事件。[示例](tools/lib/ustat_example.txt)。
- tools/[uthreads](tools/lib/uthreads.py): 跟踪 Java 和原始 pthreads 中的线程创建事件。[示例](tools/lib/uthreads_example.txt)。
##### 内存和进程工具
- tools/[execsnoop](tools/execsnoop.py): 通过 exec() 系统调用跟踪新进程。[示例](tools/execsnoop_example.txt)。
- tools/[exitsnoop](tools/exitsnoop.py): 跟踪进程终止(退出和致命信号)。[示例](tools/exitsnoop_example.txt)。
- tools/[killsnoop](tools/killsnoop.py): 跟踪由 kill() 系统调用发出的信号。[示例](tools/killsnoop_example.txt)。
- tools/[kvmexit](tools/kvmexit.py): 显示每次 VM 退出的 exit_reason 及其统计信息。[示例](tools/kvmexit_example.txt)。
- tools/[memleak](tools/memleak.py): 显示未完成的内存分配以查找内存泄漏。[示例](tools/memleak_example.txt)。
- tools/[numasched](tools/numasched.py): 跟踪进程在 NUMA 之间的迁移。[示例](tools/numasched_example.txt)。
- tools/[oomkill](tools/oomkill.py): 跟踪内存不足 (OOM) 杀手。[示例](tools/oomkill_example.txt)。
- tools/[pidpersec](tools/pidpersec.py): 计算新进程(通过 fork)。[示例](tools/pidpersec_example.txt)。
- tools/[rdmaucma](tools/rdmaucma.py): 跟踪 RDMA 用户空间连接管理器访问事件。[示例](tools/rdmaucma_example.txt)。
- tools/[shmsnoop](tools/shmsnoop.py): 跟踪 System V 共享内存系统调用。[示例](tools/shmsnoop_example.txt)。
- tools/[slabratetop](tools/slabratetop.py): 内核 SLAB/SLUB 内存缓存分配率排名。[示例](tools/slabratetop_example.txt)。
##### 性能和时间工具
- tools/[dbslower](tools/dbslower.py): 跟踪慢于阈值的 MySQL/PostgreSQL 查询。[示例](tools/dbslower_example.txt)。
- tools/[dbstat](tools/dbstat.py): 以直方图形式汇总 MySQL/PostgreSQL 查询延迟。[示例](tools/dbstat_example.txt)。
- tools/[funcinterval](tools/funcinterval.py): 以直方图形式显示同一函数之间的时间间隔。[示例](tools/funcinterval_example.txt)。
- tools/[funclatency](tools/funclatency.py): 对函数计时并显示其延迟分布。[示例](tools/funclatency_example.txt)。
- tools/[funcslower](tools/funcslower.py): 跟踪慢速内核或用户函数调用。[示例](tools/funcslower_example.txt)。
- tools/[hardirqs](tools/hardirqs.py): 测量硬 IRQ(硬中断)事件时间。[示例](tools/hardirqs_example.txt)。
- tools/[mysqld_qslower](tools/mysqld_qslower.py): 跟踪慢于阈值的 MySQL 服务器查询。[示例](tools/mysqld_qslower_example.txt)。
- tools/[ppchcalls](tools/ppchcalls.py): 汇总 ppc hcall 计数和延迟。[示例](tools/ppchcalls_example.txt)。
- tools/[softirqs](tools/softirqs.py): 测量软 IRQ(软中断)事件时间。[示例](tools/softirqs_example.txt)。
- tools/[softirqslower](tools/softirqslower.py): 跟踪慢速软 IRQ(中断)。[示例](tools/softirqslower_example.txt)。
- tools/[syscount](tools/syscount.py): 汇总系统调用计数和延迟。[示例](tools/syscount_example.txt)。
##### CPU 和调度器工具
- tools/[cpudist](tools/cpudist.py): 以直方图形式汇总每个任务的运行和非运行 CPU 时间。[示例](tools/cpudist_example.txt)
- tools/[cpuunclaimed](tools/cpuunclaimed.py): 采样 CPU 运行队列并计算未声明的空闲 CPU。[示例](tools/cpuunclaimed_example.txt)
- tools/[llcstat](tools/llcstat.py): 按进程汇总 CPU 缓存引用和未命中。[示例](tools/llcstat_example.txt)。
- tools/[offcputime](tools/offcputime.py): 按内核堆栈跟踪汇总非运行 CPU 时间。[示例](tools/offcputime_example.txt)。
- tools/[offwaketime](tools/offwaketime.py): 按内核非运行 CPU 堆栈和唤醒者堆栈汇总阻塞时间。[示例](tools/offwaketime_example.txt)。
- tools/[profile](tools/profile.py): 通过按时间间隔采样堆栈跟踪来分析 CPU 使用情况。[示例](tools/profile_example.txt)。
- tools/[runqlat](tools/runqlat.py): 以直方图形式显示运行队列(调度器)延迟。[示例](tools/runqlat_example.txt)。
- tools/[runqlen](tools/runqlen.py): 以直方图形式显示运行队列长度。[示例](tools/runqlen_example.txt)。
- tools/[runqslower](tools/runqslower.py): 跟踪较长的进程调度延迟。[示例](tools/runqslower_example.txt)。
- tools/[wakeuptime](tools/wakeuptime.py): 按唤醒者内核堆栈汇总从睡眠到唤醒的时间。[示例](tools/wakeuptime_example.txt)。
- tools/[wqlat](tools/wqlat.py): 汇总工作队列上的工作等待延迟。[示例](tools/wqlat_example.txt)。
##### 网络和套接字工具
- tools/[gethostlatency](

标签:API集成, BCC, Docker镜像, IO分析, Linux内核, Linux工具, LLVM, Lua, Python, rizin, 内核插桩, 内核调试, 动态追踪, 可观测性, 子域名枚举, 安全渗透, 客户端加密, 性能优化, 性能分析, 故障排查, 无后门, 检测绕过, 端口探测, 系统分析, 系统安全, 网络分析, 网络流量控制, 逆向工具