讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux 内存泄漏排查与修复实践

轻婷同学_5837

轻婷同学_5837

发布时间:2026-02-18 10:41:02

|

286人浏览过

|

来源于php中文网

原创

valgrind定位堆泄漏需带调试符号编译(gcc -g -O0),关注含文件名和行号的分配点;它仅跟踪malloc/new等,不监控mmap/brk;长时服务宜用gdb动态断点或/proc/PID/smaps分析PSS。

linux 内存泄漏排查与修复实践

用 valgrind 抓住堆内存泄漏的准确位置

多数人跑 valgrind --leak-check=full ./a.out 后只扫一眼“definitely lost”就停了,但真正有用的是它输出中带文件名和行号的那一行——前提是你的程序得带调试符号编译。

  • 必须用 gcc -g -O0 编译,-O2 会让内联和变量优化掩盖真实分配点
  • valgrind 对 mmap、brk 级别分配不敏感,只管 malloc/calloc/realloc 系列,C++ 的 new 也算在内
  • 如果程序一启动就崩溃,加 --tool=memcheck --track-origins=yes 查未初始化内存是否间接导致后续误释放
  • 注意 suppressions 文件干扰:默认 suppressions 可能过滤掉 glibc 内部的假阳性,但自定义 suppressions 写错会漏报真泄漏

gdb 里动态观察 malloc 调用栈

不是所有泄漏都适合等程序退出再查;长时运行服务(比如后台 daemon)需要在线盯住谁在不断 malloc 却不 free。

  • 先 gdb -p $(pidof your_service),然后 catch syscall mmap 或 break malloc,再 command 1; bt; cont; end 让每次分配都打个断点栈
  • 更轻量的做法是 watch *(int*)0xdeadbeef —— 先用 cat /proc/PID/maps 找到堆地址范围,再对某块堆内存设写入观察点,触发时看谁在改它
  • 注意 glibc 的 malloc 实现有 fastbin、tcache,小对象可能复用不走系统调用,这时候 catch syscall brk 就捕不到,得回退到 break __libc_malloc

/proc/PID/smaps 看懂 RSS 和 PSS 差异

运维常盯着 top 的 %MEM 或 ps aux 的 VSZ 判断泄漏,但这些数字根本不能定位问题——VSZ 包含没实际映射的虚拟地址,RSS 又包含共享库和 mmap 共享内存。

Zynq Linux Hardware Debug
Zynq Linux Hardware Debug

Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。

下载
  • 真正反映进程独占物理内存的是 PSS(Proportional Set Size),在 /proc/PID/smaps 每个内存段后都有,总和才接近真实增长量
  • 重点看 AnonHugePages 和 MMUPageSize 字段:如果某段 Size 很大但 RSS 接近 0,说明只是预留了虚拟地址,还没真正分配物理页
  • 用 awk '/^Size:/ {s+=$2} /^PSS:/ {p+=$2} END {print "Size:", s, "PSS:", p}' /proc/PID/smaps 快速汇总,比单看 top 可靠得多

C++ 中 std::shared_ptr 循环引用的真实表现

不是所有 C++ 内存泄漏都报错或 crash,shared_ptr 循环引用会导致对象永远不析构,但 valgrind 也标为 “still reachable”,容易被当成正常缓存。

  • 典型模式:A 持有 shared_ptr<B>,B 又持有 shared_ptr<A>;用 weak_ptr 替换其中一端才能打破循环
  • valgrind 输出里如果看到大量 “still reachable” 且堆栈指向 std::shared_ptr<...>::_M_release,基本就是这个原因
  • 不要依赖 std::enable_shared_from_this 自动管理,它本身不解决循环,反而可能让引用关系更隐蔽

堆内存泄漏最难的不是发现,是确认那个 malloc 调用到底该由谁 free——尤其是跨模块、跨线程、或者封装在第三方库回调里的分配。这时候看调用栈比看代码行号还重要。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2880

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

249

2026.02.03

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

2720

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

767

2025.10.24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6339

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3065

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3968

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2745

2025.08.29

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn