valgrind不生成可视化文件,仅输出callgrind.out.pid或massif.out.pid等原始数据;可视化需qcachegrind、massif-visualizer或gprof2dot+graphviz等外部工具完成。

直接说结论:Valgrind 本身不生成“可视化文件”,它只输出原始分析数据(如 callgrind.out.PID 或 massif.out.PID),可视化必须靠外部工具完成。
Callgrind 输出调用图需要 qcachegrind 或 gprof2dot
Callgrind 工具运行后默认生成 callgrind.out.<pid></pid>,这是纯文本格式的函数调用与指令计数记录,不能直接打开看图:
- 用
qcachegrind(或kcachegrind)直接加载该文件,就能看到火焰图、调用树、热点函数列表等交互式视图 - 若没有图形环境,可用
callgrind_annotate callgrind.out.1234生成按函数排序的文本报告 - 想转成 SVG/PNG 图片?先用
gprof2dot -f callgrind callgrind.out.1234 | dot -Tsvg -o callgraph.svg,注意系统需已安装graphviz - 常见错误:
Can't open input file多因路径写错或文件被覆盖;callgrind.out.*默认生成在当前工作目录,不是程序源码目录
Massif 内存使用时间线依赖 massif-visualizer 或 ms_print
Massif 输出的是堆内存随时间变化的快照,文件名类似 massif.out.5678,它包含多个时间点的内存分配状态:
-
massif-visualizer massif.out.5678是最直观的方式,能显示内存峰值、增长拐点、各分配点占比柱状图 - 命令行下可用
ms_print massif.out.5678查看摘要和顶部 10 个分配点,但无法反映“时间维度”趋势 - 注意:Massif 默认只记录堆(
malloc/new),不统计栈或 mmap 分配;如需更全视图,加参数--pages-as-heap=yes - 容易踩的坑:如果程序运行太快(比如不到 100ms),Massif 可能只记录 1–2 个快照,看不出变化——此时应加
--time-unit=B或降低采样间隔--max-snapshots=200
别指望 valgrind --log-file=xxx.png
所有 Valgrind 工具都只写文本/二进制分析数据,--log-file 参数仅控制错误日志(如 Memcheck 的泄漏报告)输出位置,跟可视化完全无关:
-
--log-file=report.txt对 Callgrind/Massif 无效,它们有自己固定的输出机制 - 试图用
valgrind --tool=callgrind --log-file=graph.dot ./a.out不会生成 dot 文件,只会报错或静默失败 - 真正要图形化,必须分两步:先跑 Valgrind 产出原始数据文件 → 再用对应可视化工具读取
- 权限问题高频出现:目标目录无写权限时,
callgrind.out.*根本不会生成,且无明确提示——建议提前mkdir -m 755 /tmp/valgrind && cd /tmp/valgrind再运行
最关键的细节往往藏在中间:Valgrind 输出文件名里的 PID 是进程启动时的 ID,不是你 ps 看到的后台服务主进程 PID;如果程序 fork 多次(比如 nginx、redis),得用 --trace-children=yes 并确认日志落在哪个子进程目录下。











