我正在 Windows 上使用 Visual Studio Code,我正在尝试调试一个非常非常简单的 Rust 程序,以学习如何正确使用 gnu gdb。问题当然不在程序上,我报告一下供参考:
fn main() {
println!("Hello, world!");
let a = 12;
let b = 16;
let c;
c = sum_two_integers(a, b);
println!("Sum returned: {}", c);
println!("End of Rust program...");
}
fn sum_two_integers (a:i32, b:i32) -> i32 {
let c;
c = a + b;
println!("Sum computed: {}", c);
return c;
}
问题出在 gdb.exe 上:当我从 VSCode 或 cmd 行运行它时,它只能使用 F5/“继续”才能正常工作,随后跳转到断点。
但是,如果我在第一条主线中放置一个断点(
println!("Hello, world!");
),此时我使用 F11/“step”(“step-into”命令),它会弹出一个未找到的文件(这里是 VSCode 的打印):
出现这种情况是因为我单击了 F11/“步骤”而不是 F10/“下一步”,这对于新手来说可能是合乎逻辑的。但每当我对 C/C++ 程序使用相同的调试器时,它只会跳转到下一行。
所以问题是:有人遇到过同样的问题吗?有人知道 gdb 是否可以添加一些额外的命令来避免 Rust 程序出现此问题?
这不是一个非常非常大的问题,我可以继续断点,我可以处理它,但是每次区分 F10 和 F11 命令是相当烦人的。
感谢任何可以帮助我的人!
PS:如果我使用 rustup 设置 msvc 工具链并尝试使用 VSCode 和 msvc 进行调试,也会发生这种情况。同样的问题。如果您需要更多详细信息,请问我(我不想在这个问题上增加太多负担:))。为了完整起见,这些是我的工具链,我将 gnu 设置为默认值:
PS C:\SwDev\Sw\01_Attempts\C++\VSCode\VSCode_Rust_gdb_01> rustup toolchain list
stable-x86_64-pc-windows-gnu (default)
stable-x86_64-pc-windows-msvc
发生这种情况是因为在调试信息中,在编码 stdlib 时,编译器不是将路径放置到其源代码,而是放置相对于
/rustc/<rustc_version_hash>
的文件路径。
我不知道如何全局更改它,这确实很烦人,但是对于特定项目,您可以将此前缀映射到 stdlib 源代码的真实目录(您需要安装
rust-src
rustup 组件) .
保存您所面对的窗口显示的哈希值,并在调试配置中添加以下属性:
对于 MSVC,我相信还有 gdb:
"sourceFileMap": {
"/rustc/<your_hash>": "<your_home>/.rustup/toolchains/<project_toolchain>/lib/rustlib/src/rust"
}
对于 LLDB:
"sourceMap": {
"/rustc/<your_hash>": "<your_home>/.rustup/toolchains/<project_toolchain>/lib/rustlib/src/rust"
}
还有一个设置
rust-analyzer.debug.sourceFileMap
应该对 rust-analyzer 的调试镜头执行相同的操作,但我无法让它工作。