Linux怎么查看内存泄漏的具体记录

轻静酱_1206

轻静酱_1206

2026-07-31

932人浏览

原创

valgrind检测内存泄漏需程序退出后查看“definitely lost”及对应stack trace,编译必须加-g且禁用优化,配合--track-origins=yes精准定位源头;/proc/pid/smaps中private_dirty持续增长、slabtop显示kmalloc缓存obj持续上涨、mtrace解析后出现“memory not freed”均为关键证据。

linux怎么查看内存泄漏的具体记录

查不到具体记录,说明你还没让泄漏“显形”——内存泄漏本身不会自动生成日志,必须主动用工具捕获运行时行为或解析内核/用户态的跟踪数据。

valgrind 输出里找 definitely lost 行

这是 C/C++ 程序最直接的泄漏证据,但前提是程序已退出、且编译带 -g。输出中真正有用的不是 summary,而是每一块 definitely lost 后面紧跟着的 stack trace:

  • definitely lost 行会标出字节数和分配次数,比如 definitely lost: 1,024 bytes in 1 blocks
  • 紧接着的 at 0x...: malloc (in /usr/lib/...) 是调用点,再往下几行的 by 0x...: your_function (your_file.c:42) 才是源头
  • 如果没看到源码行号,说明没加 -g 编译,或者 LD_LIBRARY_PATH 没指向调试版 libc
  • 别忽略 --track-origins=yes 参数——它能帮你定位指针赋值丢失的位置,比只看 malloc 更准

/proc/PID/smaps 里看 Private_Dirty 增长趋势

/proc/PID/smaps 不是“记录”,但它是泄漏在物理内存上的真实投影。重点盯住 Private_Dirty 字段(即进程独占且被修改过的物理页),它比 RSS 更细粒度:

Linux installer
Linux installer

先解析安全源,运行本地CLI安装、启动、卸载Linux桌面应用。用户请求时使用。

下载
  • 执行 grep -A 1 -B 1 "Private_Dirty" /proc/PID/smaps | grep -E "^[0-9]" 提取数值,单位 KB
  • 配合 watch -n 5 'grep -A 1 -B 1 "Private_Dirty" /proc/PID/smaps | grep -E "^[0-9]"' 每 5 秒刷新一次,观察是否单调上升
  • 若某次业务操作后 Private_Dirty 涨了 2MB 且不再回落,基本可锁定该操作路径下的分配未释放
  • 注意:Anonymous 映射段的 Private_Dirty 高,大概率是堆泄漏;而 libxxx.so 段的高,则可能是全局缓存或静态对象累积

slabtop -s -a 看 kmalloc-* 缓存满载状态

内核态泄漏不记日志,但会在 slab 中留下“尸体”。slabtop -s -a 的输出里,真正要抓的是那些 USE 接近 100% 且 OBJ/SLAB 数持续上涨的缓存:

  • 重点关注 kmalloc-128、kmalloc-256 这类通用分配器缓存——它们被驱动、模块、文件系统大量使用
  • 如果 ACTIVE 和 NUM OBJS 都在涨,且 sharedavail 趋近于 0,说明 slab 已碎片化,新分配只能开新 slab,旧 slab 却无法回收
  • cat /proc/slabinfo | grep kmalloc-128 查具体字段:num_slabs 上涨 + sharedavail 下降 = 典型泄漏特征
  • 别只看 slabtop 当前快照——它不保存历史,必须用 watch -n 30 'slabtop -s -a | head -10' 对比连续变化

mtrace 日志需手动解析,不能直接读

mtrace 生成的 MALLOC_TRACE 文件是纯文本,但不是人类可读的日志——它只记录地址和大小,没有上下文:

  • 必须用 mtrace ./your_program ./mtrace.log 解析,否则看到的只是类似 @ 0x7f8fb5784000 0x100 这样的原始记录
  • 解析后输出里出现 Memory not freed: 开头的块,才代表泄漏;每行末尾的 ./your_file.c:88 是唯一可定位的线索
  • 如果解析结果为空,常见原因是:没在 main() 开头调用 mtrace(),或程序异常退出(如 segfault)导致 muntrace() 未执行
  • mtrace 只跟踪 malloc/free,对 mmap/MAP_ANONYMOUS 或 C++ new 无效——这点容易误判

真正难的不是找到“记录”,而是确认哪条记录对应真实泄漏:用户态的 definitely lost 地址可能被 reuse,内核态的 kmalloc-128 满载可能是正常负载峰值。关键得交叉验证——比如 pmap -x PID 看匿名映射增长 + valgrind 报告位置一致,才能下结论。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux valgrind

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

3970

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3413

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2573

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6230

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

5862

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3433

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

2925

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3159

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习