我在/src/lib.rs
內有一個lib。我想準備用GDB進行調試。使用GDB的Rust調試庫
rustc -g --crate-type lib libr.rs
搜索的方式告訴我該怎麼做。輸出文件有以下名稱liblib.rlib
現在運行GDB - 執行file lib.rs
告訴我它不是可執行格式,並且與奇怪文件liblib.rlib
相同。我知道這不是一個可執行文件 - 但我也不知道任何可以開始的替代文件。
那麼我該如何開始在Rust中調試一個庫?
我在/src/lib.rs
內有一個lib。我想準備用GDB進行調試。使用GDB的Rust調試庫
rustc -g --crate-type lib libr.rs
搜索的方式告訴我該怎麼做。輸出文件有以下名稱liblib.rlib
現在運行GDB - 執行file lib.rs
告訴我它不是可執行格式,並且與奇怪文件liblib.rlib
相同。我知道這不是一個可執行文件 - 但我也不知道任何可以開始的替代文件。
那麼我該如何開始在Rust中調試一個庫?
您不能調試除可執行文件以外的任何內容。調試器通過檢查正在運行的進程的內存來工作;沒有可執行文件,你不能擁有一個進程。
假設這兩個文件:
的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 build
或cargo 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 build
或cargo test
默認在調試模式下編譯。您也可以build your tests in release mode。
因此,在任何情況下,目標/調試中的測試文件是否能夠被調試? – xetra11
@ xetra11在target/debug中生成的可執行文件能夠被調試,是的。 – Shepmaster
在這個庫中是否有測試需要調試? – user25064
沒有測試在/tests/raindrops.rs內 - 但實際上,是的,我想通過那些測試調試測試或調用 – xetra11