Debugging 用gdb调试Rust

Debugging 用gdb调试Rust,debugging,gdb,rust,Debugging,Gdb,Rust,我知道这里关于StackOverflow的调试问题,我在Go之前也使用过gdb。然而,我遇到了一个问题,gdb似乎无法找到调试符号 在main.rs中考虑这个复杂的程序 pub fn main () { println!("run"); } 我用调试符号编译它 rustc -g main.rs 然后我运行gdb gdb main 这提供了第一条线索,即加载调试符号的某些内容不太正确 现在当我在gdb中输入 list 它留给我一些C代码,这不是我所期望的 我做错了什么?我的gd

我知道这里关于StackOverflow的调试问题,我在Go之前也使用过gdb。然而,我遇到了一个问题,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 --configuration
This GDB was configured as follows:
   configure --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 (relocatable)
             --with-jit-reader-dir=/usr/local/lib/gdb (relocatable)
             --without-libunwind-ia64
             --without-lzma
             --with-python=/System/Library/Frameworks/Python.framework/Versions/2.7
             --with-separate-debug-dir=/usr/local/lib/debug (relocatable)
             --with-zlib
             --without-babeltrace

好吧,我知道怎么回事了。我必须手动发出
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

相同的问题,更高版本的Rust(1.0.0-beta),完全不同的答案:

在GDB中,调试Rust可执行文件时,
break main
在Rust标准库的某些设置代码中设置断点。这不是你想要的


改为键入:
break$YOUR_cratet::main
,用程序名替换
$YOUR_cratet

无法在Arch Linux上复制。您使用的是哪个版本或锈迹?我使用的是
rustc 0.11.0-pre(3035d8dfb13077e195eb056568183911c90c1b4b 2014-07-02 21:26:40+0000)
Hm,这可能是;你能试试那里建议的
-g-C llvm args=“-dwarf version 4”
变通方法吗?不,对我来说没有任何改变。但是/Users/cburgdorf/Documents/hacking/rust playder/main.o怎么办?它似乎试图从
main.o
加载不存在的符号?或者它只是第二次尝试,因为它在
main
二进制文件中找不到它们?我在arch linux上没有.o文件,它可以工作(rust master,gdb 7.7.1),多亏了#rust IRC频道上的“jshs”提供了这一点智慧。请注意,较新版本的rust。您还可以在gdb中使用
start
命令,类似于“断开干线;运行”--但它会在用户提供的主程序处停止。