--xml=yes 仅对 --tool=memcheck 有效,必须显式指定该工具;默认 memcheck 不启用 xml 输出,且需配合 --xml-file= 才能生成可解析的 xml 报告。

valgrind --xml=yes 必须配合 --tool=memcheck 使用
Memcheck 是唯一支持 XML 输出的 Valgrind 工具,其他工具(如 helgrind、callgrind)传入 --xml=yes 会直接报错并退出。如果你看到 unrecognised option: --xml 或 XML output not supported by this tool,基本就是误用了工具或漏写了 --tool=memcheck。
正确写法只有这一种组合:
valgrind --tool=memcheck --xml=yes ./myprogram
不加 --tool=memcheck 时,Valgrind 虽默认启用 Memcheck,但此时 --xml=yes 不生效 —— 这是常见坑点,必须显式指定。
--xml-file= 才能保存 XML 到文件
--xml=yes 只是开启 XML 格式输出,但默认仍输出到 stderr,不是文件。想生成可解析的 XML 报告,必须配 --xml-file=:
-
--xml-file=valgrind-report.xml:写入当前目录下的固定文件名 -
--xml-file=valgrind-report.%p.xml:%p会被替换成进程 PID,避免并发覆盖 - 不能只用
--log-file=xxx.xml:它输出的是普通文本日志,不是 XML 结构
示例命令:
valgrind --tool=memcheck --xml=yes --xml-file=report.xml ./a.out
XML 报告里没有 “still reachable” 类泄漏?检查 --show-reachable
默认 XML 输出中,still reachable 和 suppressed 类型的内存块不会出现在 <error></error> 节点下,即使你加了 --leak-check=full。这是因为 Memcheck 的 XML schema 只把 definitely lost、indirectly lost、possibly lost 视为“错误”,而前两者属于“状态信息”。
如果需要在 XML 中也包含可达内存的统计,得额外加参数:
-
--show-reachable=yes:让still reachable出现在<error kind="StillReachable"></error>节点里 -
--suppressions=mysupp.supp配合--gen-suppressions=all可导出压制规则,但不会进主报告
注意:--show-reachable=yes 会让 XML 文件体积明显变大,且部分解析器(如 Jenkins 的 Valgrind 插件)可能不识别该 kind。
CI/CD 里解析 XML 报告容易卡在 DTD 加载失败
Valgrind 生成的 XML 开头有 ..> 声明,指向本地 DTD 文件(如 /usr/share/valgrind/memcheck.h)。CI 环境通常没装 Valgrind 开发包,解析器(如 Python 的 xml.etree.ElementTree)尝试加载 DTD 会超时或报 IOError。
绕过方法有两个:
- 用
--xml-userdatum=ci-run(Valgrind ≥ 3.15)+ 自定义 XSLT,但需配套处理 - 更简单:用
sed在生成后删掉 DOCTYPE 行(安全,不影响结构):sed -i '/^d' report.xml
别依赖 --xml-stylesheet:它只影响显示,不解决解析问题;也别用 --xml=no 回退 —— 那就不是 XML 了。
XML 输出对自动化友好,但细节比文本报告更脆弱:路径权限、DTD、kind 分类、PID 占位符处理都得对齐。跑一次 valgrind --tool=memcheck --xml=yes --xml-file=test.xml true 先看基础结构,比直接塞进 pipeline 更稳妥。











