首页 文章

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

提问于
浏览
3

我试图通过这个:

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

我尝试用两种方法进行编译: cargo buildrustc -g -L src/main.rs

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

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 回答

  • 2

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

    您在Rust中看到的 main 与编译后的二进制文件中存在的 main 不同 . 具体来说,两者之间有许多垫片方法 . Rust main 实际上包括crate名称(在我的示例中为 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
    

    rbreak 应该是GDB中的等价物 .

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

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

    既没有(gdb)rbreak'hack-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 中具有非常唯一名称的函数,并在其上设置断点:

    (lldb) br set -r '.*a_really_unique_name.*'
    

相关问题