使用GDB调试Rust

15
我知道在 Stack Overflow 上有关于 Rust 调试的问题,并且我之前也用过 GDB 调试 Go。但是,我遇到了一个问题,似乎 GDB 找不到调试符号。
请看这个复杂的程序在 main.rs 中:
pub fn main () {
    println!("run");
}

我使用调试符号进行编译

rustc -g main.rs

然后我运行 GDB

gdb main

这表明调试符号的加载可能存在问题。

GDB: can't open to read error

现在当我在 GDB 中输入

list

这让我留下了一些不符合我的预期的C代码。

screenshot of gdb list showing C code

我做错了什么?我的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的配置如下:
    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

无法在Arch Linux上重现。 - Chris Morgan
我正在使用 rustc 0.11.0-pre (3035d8dfb13077e195eb056568183911c90c1b4b 2014-07-02 21:26:40 +0000) - Christoph
嗯,这可能是#15567;你能试试那里建议的-g -C llvm-args="-dwarf-version 4"解决方法吗? - huon
你是否使用了一些自定义的.gdbinit文件?如果你设置了一些源代码路径,那么可能会出现这种情况。 - Mantosh Kumar
@MantoshKumar 不是的。我发布了gdb --configuration的输出结果。这个有什么有用的信息吗? - Christoph
显示剩余3条评论
2个回答

13

相同的问题,在稍后的Rust版本(1.0.0-beta)中有完全不同的答案:

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

而是输入:break $YOUR_CRATE::main,将您的程序名称替换为$YOUR_CRATE


1
感谢 #rust IRC 频道上的 "jshs" 分享这个智慧。 - Jason Orendorff
请注意,Rust的新版本在方法名称中包含哈希值 - Shepmaster
1
你也可以在gdb中使用start命令,它类似于“break main; run”--但它会停在用户提供的主程序处。 - Tom Tromey

8

好的,我已经弄清楚了问题所在。我需要手动发出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

我在Arch Linux上没有.o文件,并且它可以正常工作(Rust Master,GDB 7.7.1) - Arjan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接