使用GDB调试使用Rust 1.10编译的程序时,无法在main上设置断点

使用GDB调试使用Rust 1.10编译的程序时,无法在main上设置断点,gdb,rust,Gdb,Rust,我正在努力解决这个问题: fn main() { println!("Hello {}", 0); } 我试着用这两种方法编译:cargo build和rustc-g-L src/main.rs 然后我运行gdb-target/debug/rust-gdb-test(或gdb-main),并尝试使用break-main在main上设置断点 (break::rust gdb test::main返回Function:::rust gdb test“未定义。) 在中断(main()中的断点

我正在努力解决这个问题:

fn main() {
    println!("Hello {}", 0);
}
我试着用这两种方法编译:
cargo build
rustc-g-L src/main.rs

然后我运行
gdb-target/debug/rust-gdb-test
(或
gdb-main
),并尝试使用
break-main
main
上设置断点

break::rust gdb test::main
返回
Function:::rust gdb test“未定义。

在中断(
main()中的断点1,0x00005559610
)后,如果我尝试运行
列表
,我会得到:

1 dl debug.c:没有这样的文件或目录。
我正在运行Rust 1.10.0
(cfcb716cf 2016-07-03)
和GDB 7.7.1
(Debian 7.7.1+dfsg-5)


两年前有人问了我一个问题,但我无法让这里提供的解决方案发挥作用。

注意:我似乎不再安装GDB,只安装了LLDB,但对于这个问题,答案是一样的

在Rust中看到的
main
与编译后的二进制文件中存在的
main
不同。具体而言,这两种方法之间有许多垫片方法。Rust
main
实际上包括板条箱名称(在我的示例中为
buggin
)和散列(在我的示例中为
hfe08615ed561bb88
):

*帧#0:0x000000010000126d buggin`buggin::main::hfe08615ed561bb88+29位于main处。rs:2
帧#1:0x000000010000810e buggin`std::panicking::try::call::hbbf4746cba890ca7+30
帧#2:0x000000010000aadc buggin`\uu rust\u try+12
帧#3:0x000000010000aa76 buggin `u锈u可能u抓到u恐慌+38
帧4:0x0000000100007f32 buggin`std::rt::lang#u start::hbcefdc316c2fbd45+562
帧#5:0x00000001000013aa buggin`main+42
帧#6:0x00007fff910435ad libdyld.dylib`start+1
帧#7:0x00007fff910435ad libdyld.dylib`start+1
在这里,您可以看到
main
在堆栈的几帧之外

我倾向于使用通配符断点来不处理哈希:

(lldb)br set-r'buggin::main.*'
断点5:where=buggin`buggin::main::hfe08615ed561bb88+29,地址=0x000000010000126d
rbreak
应该是GDB中的等效项

一旦程序停止,您应该能够看到源代码。您可能还对随附锈迹的
rust lldb
rust gdb
包装感兴趣,并稍微改善体验

这与基本相同,但提到了散列

无论是
(gdb)rbreak'rust gdb test::main.*'
还是
(lldb)br set-r'rust gdb test::main.*'
都不能为我设置任何断点

连字符(
-
)不是有效的符号字符。编译时,它将转换为下划线

我最初的方法实际上是:

(lldb)br set-r'.*main.*'
断点2:67个位置。
然后,您可以运行该程序并继续几次,直到找到正确的位置。不要害怕到那里去探索一下;这只是一个调试器

您可以尝试各种版本的正则表达式,看看是否有什么有趣的匹配:

(lldb)br set-r'.*main::*'
断点3:where=rust gdb test`rust_gdb_test::main::h97d2ac6fea75a245+29,
(lldb)br集合-r'.*::main.*'
断点4:where=rust gdb test`rust_gdb_test::main::h97d2ac6fea75a245+29,
您还可以从
main
调用具有非常唯一名称的函数,并在该函数上设置断点:

(lldb)br set-r'.*一个真正唯一的名称。*'

rbreak'rust gdb test::main.*或
(lldb)br set-r'rust gdb test::main.*'
为我设置任何断点。在gdb中,如果使用
start
命令,它将停止在rust主程序的第一行,而不是rust提供的“bootstrap main”。