Linux系统防内存泄漏:kmemleak和BPF内存分析工具链介绍

检测维修 0 99

对于Linux系统开发以及运维而言,内存泄漏属于一个常见且棘手的问题,内存泄漏致使系统内存渐渐匮乏,进而对系统性能产生影。响,甚至引发系统崩溃。及时找出并定位内存泄漏情况,对保障系统的稳定性与可靠性来说十分关键。本文会就两种强大的内存泄漏检测工具,也就是kmemleak以及BPF内存分析工具链予以介绍,以此助力开发者高效性地找寻内存泄漏问题。

kmemleak:内核内存泄漏检测利器

kmemleak原理

Linux内核所提供的一个名叫kmemleak的内存泄漏检测工具,它于内存分配之际以及释放之时,为记录相关信息而进行操作,以此来检测是不是存在未被释放的内存块。其进程于内核启动的时候开启,会定期去扫描内核内存,把分配了然而确实未被释放的内存块记录留档,并且生成相应报告。开发者能够依据报告当中的信息去定位内存泄漏的具体位置。

使用kmemleak检测内存泄漏

1. 配置内核支持kmemleak

在对内核开始进行编译这个行为的时候,是要求去启用kmemleak选项的。在内核配置菜单当中,要寻找到“Kernel hacking” ,之后再找到 “Memory Debugging”,然后勾选“Enable kmemleak”选项。

2. 启动内核时启用kmemleak

在内核启动参数中添加kmemleak=on,例如:

bash

运行grubby,让此次更新内核更新所有内核,并且运行时带上kmemleak=on这样的参数。

然后重启系统使配置生效。

3. 触发内存泄漏并收集报告

程序运行之后,若是存在可能内存泄漏的情况,那么能够借助下方命令,去触发kmemleak扫描最终生成报告。

bash

# 手动触发扫描

执行echo scan这个操作指令,让该指令的输出结果,被传送到/sys/kernel/debug/kmemleak这个文件路径当中。

# 查看kmemleak报告

用cat指令去查看,位于/sys/kernel/debug/路径下的kmemleak文件。

代码示例:模拟内存泄漏并使用kmemleak检测

#include

#include

静态整型,在初始化时,名为我的模块初始化的函数,其返回值类型为整型,函数定义开始了,左大括号。

// 分配内存但不释放,模拟内存泄漏

空格处填入无类型指针指向的泄漏指针,它等于调用内核内存分配函数,分配大小为1024,内存分配类型是 GFP_KERNEL。

if (!leak_ptr) {

printk,KERN_ERR,“Memory allocation failed,这个内容被输出”,此处要注意,句末带标点符号。

return -ENOMEM;

把printk函数调用,写成一个语句,KERN_INFO作为一个参数"Module loaded, memory leaked at %p\n"这个字符串作为另一个参数,leak_ptr作为又一个参数。

return 0;

静态的,无效的,退出,我的,模块退出,函数,(这里是一对括号)左括号,空的返回值类型,右括号,左花括号。

printk(将内核提示信息设置为"Module unloaded\n"后进行输出)。

module_init(my_module_init);

module_exit(my_module_exit);

linux c++内存泄露检测工具_Linux内存泄漏检测工具 kmemleak BPF内存分析工具链

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Your Name");

"MODULE_DESCRIPTION",这是一个用于展示内存泄漏的模块。

针对上述模块,需先进行编译,之后将其加载,如此后运行cat /sys/kernel/debug/kmemleak命令,于报告当中应当能够看见诸如“unreferenced object”这般的条目,这些条目会指向我们所模拟出的发生泄漏的内存块。

kmemleak的优缺点

kmemleak的好处便是运用起来简便,无需针对程序开展特别修正,能够于内核层面察觉内存泄漏。不足之处是其会对系统性能造成一定的影响,而且在繁杂的内存分配情形下,有可能会出现误报。

BPF内存分析工具链:精准定位内存泄漏

BPF原理

处于一种强大内核架构之列,具备允许用户于用户空间之中撰写相应应用程序,且能够在内核范畴里获得安全执行条件的东西,被称作BPF(Berkeley Packet Filter),利用此项技术的BPF内存分析工具链,能够针对内存从分配直至释放这样的操作过程实施实时性质的严密监控,并予以详细的内存使用状况信息记性记录,进而凭借该等记录更为精准无误地将内存泄漏的具体位置找寻出来,就是这样 的。

使用BPF工具检测内存泄漏

1. 安装BPF工具

能够运用bcc也就是字节码编译器收集框架这一工具包,它给出了诸多基于伯克利包过滤器的实用的工具。于基于黛比安版/犹奔突版的系统之上,能够借由以下这般的命令来开展安装操作:

bash

sudo apt-get update

使用终端命令“sudo”,通过“apt-get”方式,进行“install”操作,“bpfcc-tools”是要安装的内容,“linux-headers-$(uname -r)”也是要安装的内容。

2. 使用memleak工具检测内存泄漏

有个叫memleak的工具,这工具在bcc工具包里头,它能够实时去监控内存的分配以及释放情况,并且还会报告有可能出现的内存泄漏现象。要启动memleak的话,需运行以下命令才行:

bash

sudo memleak -p

# 监控指定进程

# 或者

执行sudo,运行memleak,添加-a参数,以此来,对所有进程,进行监控。

代码示例:结合BPF工具分析内存泄漏

假使其时我们存有一个正处于运行状态的程序,我们心里怀疑它存在着内存泄漏的情况。运用memleak去监控那个进程:

bash

# 先找到目标进程的PID

ps aux | grep your_program

# 然后使用memleak监控

sudo memleak -p

memleak能够实时呈现内存分配以及释放的信息,一旦检测出有可能出现的内存泄漏情况,那么就会把与之相关的调用栈信息输出出来,以此来协助开发者确定泄漏的位置处。

BPF工具的优缺点

BPF 工具的突出优势包括,具备很强的实时性,能够给出详尽的内存使用方面的信息以及调用栈的情况,在定位上更为精准。然而其存在明显不足,BPF 程序在编写以及理解层面相对复杂难解,这就要求拥有一定幅度的 BPF 编程相关知识。

总结

kmemleak,是Linux系统里一种很实用的内存泄漏检测工具,BPF内存分析工具链,也是Linux系统里一种很实用的内存泄漏检测工具,kmemleak,适合在内核层面开展初步的内存泄漏检测,而BPF工具链,能够给出更精准的定位信息,在实际使用过程中,开发者能够依照具体的需求以及场景挑选适宜的工具,或者将这两种工具结合一起使用,高效地搜寻内存泄漏问题,保障系统的稳定运作。

相关推荐: