Linux内核内存泄漏怎么办?

嵌入式大杂烩 2023-06-24 20:31

Linux内核内存泄漏怎么搞?

1、Kmemleak介绍

Linux内核开发中,Kmemleak是一种用于检测内核中内存泄漏的工具

内存泄漏指的是程序中已经不再使用的内存没有被妥善地释放,导致内存的浪费。内核中的内存泄漏同样会导致系统性能下降、系统崩溃等问题。

Kmemleak能够检测内核中的内存泄漏,通过检测内核中未被释放但又无法找到其使用位置的内存,进一步定位、修复内存泄漏的问题。

在用户空间,我们常用Valgrind来检测;

在内核空间,我们常用Kmemleak来检测。

 

2、如何使用Kmemleak

2.1 内核配置

内核打开相应配置

  • CONFIG_DEBUG_KMEMLEAKKmemleak被加入到内核
  • CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE设置为16000:该参数为记录内存泄露信息的内存池,越大记录信息越多。
  • CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF Kmemleak默认开关状态

依赖的配置

  • CONFIG_DEBUG_KERNEL:打开内核调试功能
  • CONFIG_DEBUG_FS:需要借助到debugfs
  • CONFIG_STACKTRACE:记录进程的堆栈信息

 

2.2 用户空间配置

我们要想使用Kmemleak,需要挂在debugfs,来查看泄露的情况。

  • 进入文件系统后,进行挂载
mount -t debugfs nodev /sys/kernel/debug/   # 挂在debugfs
  • 设置扫描时间
echo scan=10 > /sys/kernel/debug/kmemleak   # 10S扫描一次

默认内存泄露检测时间为10min,上面设置为10s一次

  • 查看泄露情况
cat /sys/kernel/debug/kmemleak      # 查看内存泄露情况
  • 其他指令
echo scan > /sys/kernel/debug/kmemleak  #触发一次扫描
echo clear > /sys/kernel/debug/kmemleak     #清除当前 kmemleak 记录的泄露信息
echo off > /sys/kernel/debug/kmemleak       #关闭kmemleak(不可逆转的)
echo stack=off > /sys/kernel/debug/kmemleak #关闭任务栈扫描
echo stack=on > /sys/kernel/debug/kmemleak  #使能任务栈扫描
echo scan=on > /sys/kernel/debug/kmemleak   #启动自动内存扫描线程
echo scan=off > /sys/kernel/debug/kmemleak  #停止自动内存扫描线程
echo scan= > /sys/kernel/debug/kmemleak#设置自动扫描线程扫描间隔,默认是600,设置0则是停止扫描
echo dump= > /sys/kernel/debug/kmemleak #dump某个地址的内存块信息,比如上面的echo dump=0xffffffc008efd200 > /sys/kernel/debug/kmemleak即可查看详细信息

 

2.3 通过Linux启动参数控制开关

Kmemleak的默认开关状态可以通过CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF 配置来控制,当然也可以通过向Linux内核启动参数中加入kmemleak=off来控制。

 

3、Kmemleak原理

Kmemleak提供了一种跟踪垃圾回收器tracing garbage collector的原理,来检测内核中存在的内存泄露,其不同之处在于:孤立的对象并没有被释放掉,而是通过/sys/kernel/debug/kmemleak仅仅被报告。

这种方法同样应用于Valgrind中,不过该工具主要用于检测用户空间不同应用的内存泄露情况。

在用户空间,我们常用Valgrind来检测应用进程;

在内核空间,我们常用Kmemleak来检测内核代码。

通过kmalloc()vmalloc()kmem_cache_alloc()等函数分配内存时,会跟踪指针,堆栈等信息,将其存储在一个红黑树中。

同时跟踪相应的释放函数调用,并从kmemleak数据结构中删除指针。

简单理解:相当于追踪内存分配相关接口,记录分配内存的首地址,堆栈大小等信息,在内存释放阶段将其删除。

我们通过查看相关内核文档可知,内存泄露检测的扫描算法步骤如下:

  • 将所有对象标记为白色(最后剩余的白色对象将被视为孤立对象)
  • 从数据段和堆栈开始扫描内存,根据红黑树中存储的地址信息来检查值,如果找到指向白色对象的指针,则添加到灰色列表
  • 扫描灰色列表以查找地址匹配的对象,直到灰色列表完成
  • 剩下的白色对象被视为孤立对象,并通过/sys/kernel/debug/kmemleak进行报告

 

4、Kmemleak API接口

kmemleak_init - 初始化 kmemleak
kmemleak_alloc - 内存块分配通知
kmemleak_alloc_percpu - 通知 percpu 内存块分配
kmemleak_vmalloc - 通知 vmalloc() 内存分配
kmemleak_free - 通知内存块释放
kmemleak_free_part - 通知释放部分内存块
kmemleak_free_percpu - 通知 percpu 内存块释放
kmemleak_update_trace - 更新对象分配堆栈跟踪
kmemleak_not_leak - 将对象标记为非泄漏
kmemleak_ignore - 不扫描或报告对象泄漏
kmemleak_scan_area - 在内存块内添加扫描区域
kmemleak_no_scan - 不扫描内存块
kmemleak_erase - 擦除指针变量中的旧值
kmemleak_alloc_recursive - 作为kmemleak_alloc,但检查递归性
kmemleak_free_recursive - 作为kmemleak_free,但检查递归性

 

5、Kmemleak特殊情况

  • 漏报:真正内存泄露了,但是未报告,因为在内存扫描期间找到的值指向此类对象。为了减少误报的数量,kmemleak提供了kmemleak_ignorekmemleak_scan_areakmemleak_no_scankmemleak_erase功能

  • 误报:实际没有泄露,但是却错误的报告了内存泄露。kmemleak提供了kmemleak_not_leak功能。

 

6、Kmemleak验证

内核也提供了一个示例:kmemleak-test模块,该模块用以判断是否打开了Kmemleak功能。通过配置CONFIG_DEBUG_KMEMLEAK_TEST选项可以选择。

# modprobe kmemleak-test
# echo scan > /sys/kernel/debug/kmemleak
# cat /sys/kernel/debug/kmemleak
unreferenced object 0xffff89862ca702e8 (size 32):
  comm "modprobe", pid 2088, jiffies 4294680594 (age 375.486s)
  hex dump (first 32 bytes):
    6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
    6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b a5  kkkkkkkkkkkkkkk.
  backtrace:
    [<00000000e0a73ec7>] 0xffffffffc01d2036
    [<000000000c5d2a46>] do_one_initcall+0x41/0x1df
    [<0000000046db7e0a>] do_init_module+0x55/0x200
    [<00000000542b9814>] load_module+0x203c/0x2480
    [<00000000c2850256>] __do_sys_finit_module+0xba/0xe0
    [<000000006564e7ef>] do_syscall_64+0x43/0x110
    [<000000007c873fa6>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
...

 

7、参考文章

  • 内核官方文档:https://www.kernel.org/doc/html/latest/dev-tools/kmemleak.html
  • 其他文章推荐:https://blog.csdn.net/weixin_41944449/article/details/123441820

 

本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

注意

由于微信公众号近期改变了推送规则,为了防止找不到,可以星标置顶,这样每次推送的文章才会出现在您的订阅列表里。


猜你喜欢:

《嵌入式Linux驱动大全》

谈谈嵌入式软件的兼容性!

在公众号聊天界面回复1024,可获取嵌入式资源

嵌入式大杂烩 专注于嵌入式技术,包括但不限于C/C++、嵌入式、物联网、Linux等编程学习笔记,同时,内包含大量的学习资源。欢迎关注,一同交流学习,共同进步!
评论 (0)
  • 文/Leon编辑/cc孙聪颖‍“无AI,不家电”的浪潮,正在席卷整个家电行业。中国家电及消费电子博览会(AWE2025)期间,几乎所有的企业,都展出了搭载最新AI大模型的产品,从电视、洗衣机、冰箱等黑白电,到扫地机器人、双足机器人,AI渗透率之高令人惊喜。此番景象,不仅让人思考:AI对于家电的真正意义是什么,具体体现在哪些方面?作为全球家电巨头,海信给出了颇有大智慧的答案:AI化繁为简,将复杂留给技术、把简单还给生活,是海信对于AI 家电的终极答案。在AWE上,海信发布了一系列世俱杯新品,发力家
    华尔街科技眼 2025-03-23 20:46 78浏览
  • 在嵌入式语音系统的开发过程中,广州唯创电子推出的WT588系列语音芯片凭借其优异的音质表现和灵活的编程特性,广泛应用于智能终端、工业控制、消费电子等领域。作为该系列芯片的关键状态指示信号,BUSY引脚的设计处理直接影响着系统交互的可靠性和功能拓展性。本文将从电路原理、应用场景、设计策略三个维度,深入解析BUSY引脚的技术特性及其工程实践要点。一、BUSY引脚工作原理与信号特性1.1 电气参数电平标准:输出3.3V TTL电平(与VDD同源)驱动能力:典型值±8mA(可直接驱动LED)响应延迟:语
    广州唯创电子 2025-03-26 09:26 74浏览
  • 在智能终端设备开发中,语音芯片与功放电路的配合直接影响音质表现。广州唯创电子的WTN6、WT588F等系列芯片虽功能强大,但若硬件设计不当,可能导致输出声音模糊、杂音明显。本文将以WTN6与WT588F系列为例,解析音质劣化的常见原因及解决方法,帮助开发者实现清晰纯净的语音输出。一、声音不清晰的典型表现与核心原因当语音芯片输出的音频信号存在以下问题时,需针对性排查:背景杂音:持续的“沙沙”声或高频啸叫,通常由信号干扰或滤波不足导致。语音失真:声音断断续续或含混不清,可能与信号幅度不匹配或功放参数
    广州唯创电子 2025-03-25 09:32 66浏览
  • WT588F02B是广州唯创电子推出的一款高性能语音芯片,广泛应用于智能家电、安防设备、玩具等领域。然而,在实际开发中,用户可能会遇到烧录失败的问题,导致项目进度受阻。本文将从下载连线、文件容量、线路长度三大核心因素出发,深入分析烧录失败的原因并提供系统化的解决方案。一、检查下载器与芯片的物理连接问题表现烧录时提示"连接超时"或"设备未响应",或烧录进度条卡顿后报错。原因解析接口错位:WT588F02B采用SPI/UART双模通信,若下载器引脚定义与芯片引脚未严格对应(如TXD/RXD交叉错误)
    广州唯创电子 2025-03-26 09:05 77浏览
  • 在智慧城市领域中,当一个智慧路灯项目因信号盲区而被迫增设数百个网关时,当一个传感器网络因入网设备数量爆增而导致系统通信失效时,当一个智慧交通系统因基站故障而导致交通瘫痪时,星型网络拓扑与蜂窝网络拓扑在构建广覆盖与高节点数物联网网络时的局限性便愈发凸显,行业内亟需一种更高效、可靠与稳定的组网技术以满足构建智慧城市海量IoT网络节点的需求。星型网络的无线信号覆盖范围高度依赖网关的部署密度,同时单一网关的承载设备数量有限,难以支撑海量IoT网络节点的城市物联系统;而蜂窝网络的无线信号覆盖范围同样高度依
    华普微HOPERF 2025-03-24 17:00 177浏览
  •       知识产权保护对工程师的双向影响      正向的激励,保护了工程师的创新成果与权益,给企业带来了知识产权方面的收益,企业的创新和发明大都是工程师的劳动成果,他们的职务发明应当受到奖励和保护,是企业发展的重要源泉。专利同时也成了工程师职称评定的指标之一,专利体现了工程师的创新能力,在求职、竞聘技术岗位或参与重大项目时,专利证书能显著增强个人竞争力。专利将工程师的创意转化为受法律保护的“无形资产”,避免技术成果被他人抄袭或无偿使
    广州铁金刚 2025-03-25 11:48 125浏览
  • 在智能终端设备快速普及的当下,语音交互已成为提升用户体验的关键功能。广州唯创电子推出的WT3000T8语音合成芯片,凭借其卓越的语音处理能力、灵活的控制模式及超低功耗设计,成为工业控制、商业终端、公共服务等领域的理想选择。本文将从技术特性、场景适配及成本优势三方面,解析其如何助力行业智能化转型。一、核心技术优势:精准、稳定、易集成1. 高品质语音输出,适配复杂环境音频性能:支持8kbps~320kbps宽范围比特率,兼容MP3/WAV格式,音质清晰自然,无机械感。大容量存储:内置Flash最大支
    广州唯创电子 2025-03-24 09:08 192浏览
  • 无论你是刚步入职场的新人,还是已经有几年经验的职场老手,培养领导力都是职业发展中一个至关重要的环节。拥有良好的领导能力不仅能让你从人群中脱颖而出,也能让你在团队中成为一个值得信赖、富有影响力的核心成员。什么是领导力?领导力并不仅仅意味着“当老板”或者“发号施令”。它更多地是一种能够影响他人、激发团队潜能,并带领大家实现目标的能力。一位优秀的领导者需要具备清晰的沟通能力、解决问题的能力,以及对人心的深刻理解。他们知道如何激励人心,如何在压力下保持冷静,并能在关键时刻做出正确的决策。如何培养领导力?
    优思学院 2025-03-23 12:24 94浏览
  •        当今社会已经步入了知识经济的时代,信息大爆炸,新鲜事物层出不穷,科技发展更是一日千里。知识经济时代以知识为核心生产要素,通过创新驱动和人力资本的高效运转推动社会经济发展。知识产权(IP)应运而生,成为了知识经济时代竞争的核心要素,知识产权(Intellectual Property,IP)是指法律赋予人们对‌智力创造成果和商业标识等无形财产‌所享有的专有权利。其核心目的是通过保护创新和创意,激励技术进步、文化繁荣和公平竞争,同时平衡公共利益与
    广州铁金刚 2025-03-24 10:46 75浏览
  • 核心板简介创龙科技 SOM-TL3562 是一款基于瑞芯微 RK3562J/RK3562 处理器设计的四核 ARM C ortex-A53 + 单核 ARM Cortex-M0 全国产工业核心板,主频高达 2.0GHz。核心板 CPU、R OM、RAM、电源、晶振等所有元器件均采用国产工业级方案,国产化率 100%。核心板通过 LCC 邮票孔 + LGA 封装连接方式引出 MAC、GMAC、PCIe 2.1、USB3.0、 CAN、UART、SPI、MIPI CSI、MIPI
    Tronlong 2025-03-24 09:59 184浏览
  • 在人工智能与物联网技术蓬勃发展的今天,语音交互已成为智能设备的重要功能。广州唯创电子推出的WT3000T8语音合成芯片凭借其高性能、低功耗和灵活的控制方式,广泛应用于智能家居、工业设备、公共服务终端等领域。本文将从功能特点、调用方法及实际应用场景入手,深入解析这款芯片的核心技术。一、WT3000T8芯片的核心功能WT3000T8是一款基于UART通信的语音合成芯片,支持中文、英文及多语种混合文本的实时合成。其核心优势包括:高兼容性:支持GB2312/GBK/BIG5/UNICODE编码,适应不同
    广州唯创电子 2025-03-24 08:42 158浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦