我知道 Stack Overflow 上的调试 Rust 问题,我之前也使用过 GDB 和 Go。但是,我遇到了一个问题,似乎 GDB 无法找到调试符号。
考虑
main.rs
中的这个复杂程序:
pub fn main () {
println!("run");
}
我用调试符号编译它
rustc -g main.rs
然后我运行 GDB
gdb main
这给出了第一个线索,表明加载调试符号的东西不太正确。
现在当我在 GDB 中输入
list
它给我留下了一些 C 代码,这不是我所期望的。
我做错了什么?我的 GDB 版本是 7.7,我在 OS X 10.9.2 (13C64) 上。我的 rustc 版本是 rustc 0.11.0-pre (3035d8dfb13077e195eb056568183911c90c1b4b 2014-07-02 21:26:40 +0000).
查看
gdb --configuration
的输出也可能有帮助:
这个 GDB 配置如下: 配置 --host=x86_64-apple-darwin13.1.0 --target=x86_64-apple-darwin13.1.0 --with-auto-load-dir=:${prefix}/share/auto-load --with-auto-load-safe-path=:${prefix}/share/auto-load --with-expat --with-gdb-datadir=/usr/local/share/gdb (可重定位) --with-jit-reader-dir=/usr/local/lib/gdb (可重定位) --without-libunwind-ia64 --without-lzma --with-python=/System/Library/Frameworks/Python.framework/Versions/2.7 --with-separate-debug-dir=/usr/local/lib/debug (可重定位) --with-zlib --without-babeltrace
同样的问题,后来的 Rust 版本(1.0.0-beta),完全不同的答案:
在 GDB 中,当调试 Rust 可执行文件时,
break main
在一些作为 Rust 标准库一部分的设置代码中设置断点。这不是你想要的。
而是键入:
break $YOUR_CRATE::main
,用您的程序名称替换$YOUR_CRATE
.
好吧,我知道出了什么问题。我必须手动发出
main.o
文件。我以为 -g
参数会削减它。
现在我跑了
rustc -g main.rs --emit="obj,link"
我会跑
gdb main
一切都像魅力一样。
我为我的 bash 创建了两个别名以使事情变得简单:
alias rd='rustc -g --emit="obj,link"'
compile_and_run() {
rustc -g --emit="obj,link" $1 && gdb ${1%.*}
}
alias rdr=compile_and_run
现在我只需调用
rdr main.rs
,它就会开始使用 gdb 进行调试 main.rs
。