调试Rust bench目标基准函数触发多编译产物不支持错误
bench目标调试触发多编译工件错误的原因
问题复现环境
- 编辑器:VS Code
- Rust语言服务:Rust Analyzer(RA)
- 工具链:nightly 版本Rust
- 复现代码结构:在
benches/目录下的bench文件中使用官方test库的#[bench]宏编写基准测试,示例代码如下:
#![feature(test)] extern crate test; use test::*; #[bench] fn demo(b:& Bencher){ // 基准测试逻辑 }
问题现象
- 点击代码上方的
Run Bench代码透镜可以正常运行基准测试 - 点击
Debug代码透镜会抛出Multiple compilation artifacts are not supported错误 - 将相同的
#[bench]函数移动到bin/lib/test/example等其他编译目标下时,调试功能可正常运行,仅在独立bench目标下触发异常
根因说明
- 该问题本质是Rust Analyzer调试链路的逻辑和Cargo bench的多工件生成规则不匹配导致的:
- Cargo编译独立bench目标时,默认会同时输出两份可执行工件:一份是插桩了性能统计逻辑的正式基准运行程序,另一份是带测试校验逻辑的关联可执行文件,用于bench运行前的正确性校验
- 触发
Run Bench时,Rust Analyzer直接调用cargo bench命令,Cargo内部会自动选择正确的插桩程序执行,不会感知到多工件的存在,因此运行正常 - 触发
Debug时,Rust Analyzer不会走cargo bench的执行调度逻辑,而是会扫描当前编译目标输出目录下的所有可执行文件,将扫描到的文件传递给底层调试器(LLDB/GDB)。由于调试器仅支持加载单个可执行程序启动调试,扫描到2份bench工件时就会抛出多工件不支持的错误 - 对于
bin/lib/test/example这类编译目标,Cargo默认只会生成1份对应可执行工件,调试链路扫描时仅能拿到单个有效文件,因此不会触发该冲突
临时规避方法
- 方法1:手动配置调试启动项,在项目
.vscode/launch.json中新增bench专属调试配置,先通过cargo bench --bench <对应bench文件名> --no-run --profile dev命令生成单份带调试符号的可执行文件,将该文件路径填入配置的program字段后即可正常启动调试 - 方法2:调试阶段将需要单步调试的基准逻辑临时移动到
test目标下完成调试,验证逻辑正确性后再移回bench目标执行性能测试
内容的提问来源于stack exchange,提问作者Larry
相关产品推荐
相关产品推荐

