使用GDB生锈调试库

时间:2016-06-14 12:00:46

标签: debugging gdb rust static-libraries

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

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

搜索的方式告诉我如何做到这一点。输出文件具有以下名称liblib.rlib

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

那么我现在如何开始在Rust中调试lib?

1 个答案:

答案 0 :(得分: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时,将在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    }
  

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

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