如何让Valgrind为rustc打印最终工具统计信息?
Valgrind处理rustc时无法输出最终统计信息的原因分析
现象复现
使用Valgrind的lackey工具处理C程序时能正常输出统计信息:
$ valgrind -q --tool=lackey --basic-counts=yes whoami yugr ==3668989== Counted 0 calls to main() ==3668989== ==3668989== Jccs: ==3668989== total: 166,636 ==3668989== taken: 61,832 (37%) ...
但处理rustc时无任何统计输出:
$ valgrind --tool=lackey --basic-counts=yes rustc --version rustc 1.87.0 (17067e9ac 2025-05-09) # 此处无任何输出
即使替换rustc的main函数为极简实现,问题依然存在:
pub fn main() { safe_println!("Hello"); }
问题根源
rustc的启动流程会创建子进程来执行实际任务(包括版本信息查询、编译等),而Valgrind默认仅跟踪初始启动的父进程。当父进程完成子进程启动后提前退出,Valgrind会终止监控,不会等待子进程执行完毕,因此无法收集到实际执行代码的统计数据。
解决方法及原理
添加--trace-children=yes参数即可解决问题,这个参数会让Valgrind跟踪目标进程创建的所有子进程,从而捕获到rustc实际工作的子进程的执行数据,在子进程结束后正常输出统计信息。
需要注意的是,普通Rust程序不会有这种fork子进程的启动逻辑,因此能被Valgrind正常跟踪。
内容的提问来源于stack exchange,提问作者yugr
相关产品推荐
相关产品推荐

