BCC 工具链都是基于 eBPF 开发的。BCC 提供了贯穿内核各个子系统的动态追踪工具

工具调研
- memleak:检测内存泄漏。定期采集出未释放的内存块以及打印出其堆栈
打开文件描述符的方法如下:
1 | open |
我们经常会有需求来获取调用的堆栈,来排查一些问题,或者实现一些需求。本文来介绍 backtrace()
和 backtrace_symbols()
函数的使用。
1 |
|
backtrace()
获取函数调用堆栈数据,数据放在 buffer 中,参数 size 用来指定 buffer 中可以保存多少个 void*
元素(每个栈帧的地址)。如果回溯的函数调用个数大于 size,则只有 size 个函数调用地址被返回。因此保证一个适当的 buffer 和 size 的大小
事件驱动是一种高效的通信机制,在 linux 中,eventfd 是一个用来通知事件的文件描述符,timerfd 是定时器事件的文件描述符。二者都是内核向用户空间的应用发送通知的机制,可以高效的用来实现用户空间的事件/通知驱动的应用程序。
用于进程间通信和同步。他的主要作用是通过文件描述符来实现进程间的时间通知机制,类似于信号量或者条件变量,但比他们更加高效和简单。如下的使用场景:
eventfd
写入数据,另一个线程从 eventfd
中读取数据,实现数据传输和同步。eventfd
实现进程间通信,其中一个进程向 eventfd
写入数据,另一个进程从 eventfd
中读取数据,实现进程间数据传输和同步。
mlock 用于对内存加锁,锁住内存是为了防止这段内存被操作系统 swap 掉。此操作只有 root 权限才能运行
1 |
|
系统调用 mlock 类函数允许程序在物理内存上锁住他的部分或者全部地址空间。这会阻止 linux 将这个内存页调度到交换空间(swap space),即使程序已有一段时间没有访问这段空间。
举一个例子:内存页面的换入换出的时间延迟可能太长或者不可预知,安全性要求比较高的应用程序可能希望防止敏感的数据被唤出到交换空间,因此,攻击者可能从交换空间中恢复出这些数据。
使用 netlink 的 libnl 库:https://www.infradead.org/~tgr/libnl/