gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:00:33 26 4
gpt4 key购买 nike

我正在尝试逐步解决这个问题:

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

我试过用两者编译:cargo buildrustc -g -L src/main.rs

然后我运行 gdb target/debug/rust-gdb-test (或 gdb main ),并尝试在 main 上设置断点与 break 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) .

A similar question 2 年前被问到,但我无法使那里提供的解决方案发挥作用。

最佳答案

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

您在 Rust 中看到的 main 与编译二进制文件中存在的 main 不同。具体来说,两者之间有许多垫片方法。 Rust 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

rbreak 在 GDB 中应该是等价的。

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

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

Neither (gdb) rbreak 'rust-gdb-test::main.*' nor (lldb) br set -r 'rust-gdb-test::main.*' set any breakpoints for me.

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

我原来的方法其实是这样的:

(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.*'

关于gdb - 使用 GDB 调试使用 Rust 1.10 编译的程序时无法在 main 上设置断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38416394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com