xet*_*a11 5 debugging gdb static-libraries rust
我有一个lib /src/lib.rs
.我想准备用GDB进行调试.
rustc -g --crate-type lib libr.rs
Run Code Online (Sandbox Code Playgroud)
是搜索的方式告诉我如何做到这一点.输出文件具有以下名称liblib.rlib
现在运行GDB - 执行file lib.rs
告诉我它不是可执行格式,与奇怪的文件相同liblib.rlib
.我知道它不是可执行文件 - 但我也不知道我可以启动的任何替代文件.
那么我现在如何开始在Rust中调试lib呢?
您无法调试除可执行文件之外的任何内容 调试器通过检查正在运行的进程的内存来工作; 没有可执行文件,您就无法拥有进程.
假设这两个文件:
SRC/lib.rs
pub fn add_one(i: u8) -> u8 {
i + 2
}
#[test]
fn inline_test() {
assert_eq!(2, foo::add_one(1));
}
Run Code Online (Sandbox Code Playgroud)
测试/ awesome.rs
extern crate foo;
#[test]
fn a_test() {
assert_eq!(6, foo::add_one(5));
}
Run Code Online (Sandbox Code Playgroud)
当您运行cargo build
or时cargo test
,将在target/debug/
目录中创建测试二进制文件.在这种情况下,有一个二进制调用foo-69521add8c82059a
,一个被调用awesome-4a24b21e22bc042a
.运行任一程序运行该组测试.所有Rust测试都是这样工作的 - 生成某种可执行文件并运行它(可能使用正确的命令行标志集)将执行测试.
这个可执行文件是您在GDB或LLDB中调试所需的:
$ rust-lldb target/debug/awesome-4a24b21e22bc042a
(lldb) br set -r '.*add_one.*'
(lldb) r
Process 59413 launched: '/private/tmp/foo/target/debug/awesome-4a24b21e22bc042a' (x86_64)
running 1 test
Process 59413 stopped
* thread #2: tid = 0xe9637, 0x0000000100038a3e awesome-4a24b21e22bc042a`foo::add_one::ha28bd7bf9dda9f1d + 14 at lib.rs:2, name = 'a_test', stop reason = breakpoint 1.1
frame #0: 0x0000000100038a3e awesome-4a24b21e22bc042a`foo::add_one::ha28bd7bf9dda9f1d + 14 at lib.rs:2
1 pub fn add_one(i: u8) -> u8 {
-> 2 i + 2
3 }
Run Code Online (Sandbox Code Playgroud)
rustc -g --crate-type lib libr.rs
这避免了使用大多数人不想做的货物.此行的重要方面是-g
标志,它指示编译器添加调试信息.cargo build
或cargo test
默认情况下以调试模式编译.您还可以在发布模式下构建测试.