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

时间:2016-07-16 22:57:50

标签: gdb rust

我正试图通过这个:

fn main() {
    println!("Hello {}", 0);
}

我尝试使用cargo buildrustc -g -L src/main.rs

进行编译

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

break ::rust-gdb-test::main返回Function "::rust-gdb-test" not defined.)。

如果我尝试运行Breakpoint 1, 0x0000555555559610 in main (),则在违反(list)后,我得到:

1   dl-debug.c: No such file or directory.

我正在运行Rust 1.10.0 (cfcb716cf 2016-07-03)和GDB 7.7.1 (Debian 7.7.1+dfsg-5)

2年前曾问过similar question,但我无法让那里的解决方案发挥作用。

1 个答案:

答案 0 :(得分:2)

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

您在Rust中看到的<form ... onsubmit="myButton.disabled = true; return true;"> ... <input type="submit" name="myButton" value="Submit"> </form> 与编译二进制文件中存在的main不同。具体来说,两者之间有许多垫片方法。 Rust main实际上包含crate名称(在我的示例中为main)和一个哈希(在我的情况下为buggin):

hfe08615ed561bb88

在这里,您可以看到 * frame #0: 0x000000010000126d buggin`buggin::main::hfe08615ed561bb88 + 29 at main.rs:2 frame #1: 0x000000010000810e buggin`std::panicking::try::call::hbbf4746cba890ca7 + 30 frame #2: 0x000000010000aadc buggin`__rust_try + 12 frame #3: 0x000000010000aa76 buggin`__rust_maybe_catch_panic + 38 frame #4: 0x0000000100007f32 buggin`std::rt::lang_start::hbcefdc316c2fbd45 + 562 frame #5: 0x00000001000013aa buggin`main + 42 frame #6: 0x00007fff910435ad libdyld.dylib`start + 1 frame #7: 0x00007fff910435ad libdyld.dylib`start + 1 距离堆栈只有几帧。

我倾向于使用通配符断点来处理散列:

main

(lldb) br set -r 'buggin::main.*' Breakpoint 5: where = buggin`buggin::main::hfe08615ed561bb88 + 29, address = 0x000000010000126d 应该是GDB中的等价物。

程序停止后,您应该能够看到源代码。您可能也对Rust附带的rbreakrust-lldb包装器感兴趣并稍微改善一下体验。

这与this answer基本相同,但提到了哈希。

  

rust-gdb(gdb) rbreak 'rust-gdb-test::main.*'都没有为我设置任何断点。

连字符((lldb) br set -r 'rust-gdb-test::main.*')不是有效的符号字符。编译时,它将转换为下划线。

我原来的方法实际上是这样的:

-

然后,您可以运行该程序并继续几次,直到找到正确的位置。不要害怕进入那里探索一下;它只是一个调试器!

您可以尝试使用各种版本的正则表达式来查看是否有任何有趣的内容:

(lldb) br set -r '.*main.*'
Breakpoint 2: 67 locations.

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

main