--log-file必须用绝对路径或确认被测程序工作目录,支持%p、%q{env}等占位符避免覆盖,仅捕获valgrind自身输出不捕获程序stdout/stderr,需注意磁盘空间与权限问题。

log-file参数必须带路径,不能只写文件名
Valgrind 的 --log-file 不会默认写入当前目录,而是按相对路径解析——但这个“相对”是相对于被测试程序的当前工作目录,不是你运行 valgrind 命令时所在的目录。很多人直接写 --log-file=output.log,结果发现日志没生成,或者出现在意料之外的位置。
稳妥做法是显式指定绝对路径,比如:
valgrind --log-file=/tmp/valgrind-out.log ./my_program
如果坚持用相对路径,得确认 my_program 启动时的工作目录(例如它是否 chdir() 过),否则日志可能写进子目录甚至被丢弃(权限不足时静默失败)。
log-file支持格式化占位符,避免多进程覆盖
多个 Valgrind 实例同时运行时,若共用同一 --log-file,会互相覆盖或追加混乱。Valgrind 提供了几个内置占位符自动展开:
-
%p→ 进程 PID -
%q{ENV}→ 环境变量值(如%q{USER}) -
%%→ 字面量 % 号
常用组合:
valgrind --log-file=/tmp/vg-%p.log ./my_program
这样每个进程输出独立文件,调试并行测试或 fork 场景时特别有用。注意 %q{...} 中的环境变量必须在 Valgrind 启动前已存在,子进程里 set 的不算。
log-file不捕获所有输出,stderr 重定向仍需单独处理
--log-file 只接管 Valgrind 自身的诊断输出(如内存泄漏摘要、错误详情),**不捕获被测程序 stdout/stderr**。如果你的程序也打印日志到 stderr,它们会照常输出到终端,和 Valgrind 日志混在一起。
想统一收集,得额外重定向:
valgrind --log-file=/tmp/vg.log ./my_program 2>&1 >/dev/null | tee /tmp/app-output.log
或者更干净的做法:让程序自身把日志写文件,再用 --log-file 专注 Valgrind 报告。否则 grep 错误时容易漏掉关键行。
日志文件权限和磁盘空间容易被忽略
Valgrind 日志可能极大(尤其开启 --leak-check=full 且程序分配频繁时),单次运行轻松上 MB。如果目标路径所在分区快满,Valgrind 会静默截断日志,且不报错——你看到的可能是不完整的泄漏报告。
检查点:
- 确保
--log-file指向的目录可写,且剩余空间 ≥ 100MB(保守起见) - 避免写入 NFS 或某些容器卷,I/O 延迟可能导致 Valgrind 卡住或日志损坏
- 权限问题常见于 suid 程序:Valgrind 降权后可能无法在原路径创建日志,此时需换到
/tmp类开放目录
真出问题时,先看 ls -l /path/to/logfile 文件大小是否异常小,再查 dmesg 或磁盘用量。











