2016-06-14 236 views
5

我在/src/lib.rs内有一个lib。我想准备用GDB进行调试。使用GDB的Rust调试库

rustc -g --crate-type lib libr.rs 

搜索的方式告诉我该怎么做。输出文件有以下名称liblib.rlib

现在运行GDB - 执行file lib.rs告诉我它不是可执行格式,并且与奇怪文件liblib.rlib相同。我知道这不是一个可执行文件 - 但我也不知道任何可以开始的替代文件。

那么我该如何开始在Rust中调试一个库?

+1

在这个库中是否有测试需要调试? – user25064

+0

没有测试在/tests/raindrops.rs内 - 但实际上,是的,我想通过那些测试调试测试或调用 – xetra11

回答

5

您不能调试除可执行文件以外的任何内容。调试器通过检查正在运行的进程的内存来工作;没有可执行文件,你不能拥有一个进程。

假设这两个文件:

的src/lib.rs

pub fn add_one(i: u8) -> u8 { 
    i + 2 
} 

#[test] 
fn inline_test() { 
    assert_eq!(2, foo::add_one(1)); 
} 

测试/ awesome.rs

extern crate foo; 

#[test] 
fn a_test() { 
    assert_eq!(6, foo::add_one(5)); 
} 

当您运行cargo buildcargo test,测试二进制文件将在中创建目录。在这种情况下,有一个名为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 } 

rustc -g --crate-type lib libr.rs

这避免了使用货物,其中大多数人都不会愿意做。该行的重要方面是-g标志,它指示编译器添加调试信息。 cargo buildcargo test默认在调试模式下编译。您也可以build your tests in release mode

+0

因此,在任何情况下,目标/调试中的测试文件是否能够被调试? – xetra11

+0

@ xetra11在target/debug中生成的可执行文件能够被调试,是的。 – Shepmaster