如何调试C++调用的Rust静态库 及MSVC工具链PDB生成问题
问题1:没有PDB的情况下能否调试从C++调用的Rust代码
无法进行源码级调试。
MSVC工具链体系下,PDB文件是唯一存储二进制与源码映射关系、函数签名、变量布局、行号对应等调试信息的载体。缺少对应PDB时,调试器只能识别到二进制函数的内存地址,无法关联到Rust源码,也就无法完成单步进入、源码断点、变量查看等常规调试操作,仅能基于汇编指令做底层调试。
问题2:强制Rust编译器为静态库输出PDB的方法
可以实现,有两类常用方案:
方案1:直接生成独立的Rust静态库PDB
在编译配置中添加以下配置即可:
- 确保开启调试信息生成:在
Cargo.toml对应编译profile中设置debug = true(release模式下需要调试也可以单独给release profile配置),同时不要开启strip配置。 - 给rustc传递编译参数,指定拆分调试信息为独立PDB:
- 如果通过Cargo编译,在
.cargo/config.toml中添加如下配置:[target.'cfg(all(windows, target_env = "msvc"))'] rustflags = ["-C", "debuginfo=2", "-C", "split-debuginfo=packed"] - 如果直接调用rustc编译,执行命令:
rustc --crate-type staticlib -C debuginfo=2 -C split-debuginfo=packed src/lib.rs
- 如果通过Cargo编译,在
方案2:将Rust调试信息整合到最终C++程序的PDB中
如果你的静态库最终要链接到C的EXE/DLL中,可以不用单独生成Rust静态库的PDB:
Rust编译staticlib时,调试信息默认会嵌入到生成的中间obj文件中,你只需要在链接C程序时,将Rust编译输出目录下的所有obj文件路径传递给MSVC链接器,链接器会自动把Rust的调试符号和C的符号合并,最终生成的C程序PDB就包含Rust代码的调试信息,直接用这个PDB就能调试Rust代码。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

