我试图通过这个:
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" 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 回答
注意:我似乎没有安装GDB,只有LLDB,但对于这个问题答案是一样的 .
您在Rust中看到的
main
与编译后的二进制文件中存在的main
不同 . 具体来说,两者之间有许多垫片方法 . Rustmain
实际上包括crate名称(在我的示例中为buggin
)和一个哈希(在我的情况下为hfe08615ed561bb88
):在这里,您可以看到
main
在堆栈中距离几帧 .我倾向于使用通配符断点来处理哈希:
rbreak
应该是GDB中的等价物 .程序停止后,您应该能够看到源代码 . 您可能也对使用Rust附带的
rust-lldb
和rust-gdb
包装器感兴趣并稍微改善一下体验 .这与this answer基本相同,但提到了哈希 .
连字符(
-
)不是有效的符号字符 . 编译时,它将转换为下划线 .我原来的方法实际上是这样的:
然后,您可以运行该程序并继续几次,直到找到正确的位置 . 不要害怕进入那里探索一下;它只是一个调试器!
您可以尝试使用各种版本的正则表达式来查看是否有任何有趣的内容:
您还可以调用
main
中具有非常唯一名称的函数,并在其上设置断点: