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

Linux如何查看特定程序的内存泄露情况 Valgrind使用入门

酷墨酱_5253

酷墨酱_5253

发布时间:2026-04-14 09:10:04

|

693人浏览过

|

来源于php中文网

原创

Valgrind 不能直接检查正在运行的程序,必须在启动时介入;它通过动态插桩跟踪内存操作,不支持 attach 到已运行进程,正确做法是用 valgrind 包裹重新启动目标程序。

linux如何查看特定程序的内存泄露情况 valgrind使用入门

Valgrind 能不能直接查正在运行的程序

不能。Valgrind 必须在目标程序启动时就介入,它通过动态插桩(instrumentation)重写二进制指令来跟踪内存操作,因此无法 attach 到已运行的进程。如果你看到 valgrind --pid=1234 这类写法,那是无效的——valgrind 命令根本不支持 --pid 参数。

正确做法是:停止当前程序,改用 valgrind 包裹启动。例如原命令是 ./myapp --config=config.yml,排查时应运行:

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose ./myapp --config=config.yml
  • --leak-check=full:启用完整泄露检测(默认是 summary)
  • --show-leak-kinds=all:显示 definitely lost、indirectly lost、possibly lost、still reachable 四类结果
  • --track-origins=yes:定位未初始化内存的来源(对 Conditional jump or move depends on uninitialised value 类错误很关键)
  • 避免加 --tool=memcheck:这是默认工具,显式指定不必要,还可能因拼写错误导致失败

为什么 valgrind 报 “Invalid read/write” 却没崩

因为 Valgrind 的 Memcheck 工具在用户态拦截所有内存访问,比操作系统更早发现越界行为。程序没崩溃,只是还没踩到保护页或触发 SIGSEGV——但行为已是未定义(UB),后续可能随机 crash、数据错乱或静默污染。

常见诱因包括:

  • 使用了 malloc 分配但未 free 的指针,之后又继续读写(尤其多线程中释放后未置 NULL)
  • 数组下标越界,比如 buf[1024] 定义却访问 buf[1024](合法索引是 0–1023)
  • C++ 中 std::vector::data() 返回裸指针,但 vector 被 move 或 resize 后原指针失效
  • 结构体内存对齐 padding 导致 memcpy 覆盖相邻字段

这类问题在 valgrind 下会明确报出 Invalid write of size X 并附调用栈,比 core dump 更早暴露隐患。

Computer Use Linux
Computer Use Linux

顶级 Linux 计算机使用技能,配套独立自举运行时,无需本地 Claude 安装、私有原生模块等。

下载

Valgrind 检测 C++ 智能指针泄漏是否可靠

基本可靠,但有前提:必须用标准库实现(libstdc++ / libc++),且编译时未定义 _GLIBCXX_DEBUG 等调试宏干扰内部结构。

Valgrind 不解析 C++ 语义,它只跟踪 malloc/new 和 free/delete 的底层调用。只要智能指针析构时正确调用了 delete(如 std::unique_ptr、std::shared_ptr 的默认 deleter),就不会被记为 leak。

  • 若自定义 deleter 里漏掉 delete,valgrind 仍会报 definitely lost
  • std::shared_ptr 循环引用不会被 valgrind 标记为 leak(因为内存仍被引用),但会导致对象永不析构——需配合其他手段(如添加 weak_ptr 断点或用 AddressSanitizer + UBSan)交叉验证
  • 避免用 std::make_shared 创建对象后,又用裸指针 new 手动管理同一块内存,否则 valgrind 会误判

性能太慢、跑不动怎么办

Valgrind 的 Memcheck 工具会让程序变慢 20–50 倍,内存占用翻倍,对 I/O 密集或实时性要求高的程序几乎不可行。

可切换更轻量的替代方案:

  • 先试 addr2line -e ./myapp 0x401234 解析 core 文件地址,快速定位崩溃点
  • 用 gcc -fsanitize=address,undefined 编译(ASan+UBSan),运行时开销仅 2–3 倍,能捕获多数内存错误,但不提供 leak summary
  • 对长期运行服务,可结合 /proc/PID/status 中的 VmRSS 和 cat /proc/PID/maps | grep heap | wc -l 观察堆段增长趋势,再辅以 pstack 抓堆栈判断是否卡在某次分配
  • 若必须用 valgrind,加 --run-libc-freeres=no(跳过 glibc 自清理)和 --freelist-vol=10000000(增大空闲块缓存)可小幅提速

真正难的是那些只在特定输入路径触发、且泄露速度极慢的问题——这时候 valgrind 的 --log-file=valgrind-out.%p 配合定时采样 + diff 内存块摘要,比单次全量扫描更实用。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

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

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

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

WorkBuddy

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

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

529

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1658

2024.03.01

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4074

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

4231

2025.07.04

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

319

2026.04.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

4807

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2188

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

4807

2023.07.18

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

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