2016-06-14 11 views
5

Ich habe eine Lib innerhalb /src/lib.rs. Dies möchte ich auf das Debugging mit GDB vorbereiten.Rust Debug-Bibliothek mit GDB

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

Ist die Art und Weise Such mir erzählt, wie es zu tun. Die Ausgabedatei hat den folgenden Namen liblib.rlib

Jetzt GDB läuft - Ausführung file lib.rs mir sagt, es ist nicht in einem ausführbaren Format und das gleiche mit der seltsamen Datei liblib.rlib. Ich weiß, dass es keine ausführbare Datei ist - aber ich kenne auch keine alternative Datei, die ich starten kann.

Wie kann ich nun mit dem Debuggen einer Lib in Rust beginnen?

+1

Gibt es Tests in dieser Bibliothek, die Sie debuggen möchten? – user25064

+0

nein die Tests sind innerhalb von /tests/raindrops.rs - aber in der Tat, ja ich will Tests oder die Aufrufe durch diese Tests debuggen – xetra11

Antwort

5

Sie können nichts außer einer ausführbaren Datei debuggen. Debugger arbeiten, indem sie die Erinnerung an einen laufenden Prozess untersuchen; Ohne eine ausführbare Datei können Sie keinen Prozess haben.

Unter der Annahme, diese beiden Dateien:

src/lib.rs

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

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

Tests/awesome.rs

extern crate foo; 

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

Wenn Sie laufen cargo build oder cargo test, Test-Binärdateien wird inerstellt werdenVerzeichnis. In diesem Fall gibt es eine binäre foo-69521add8c82059a und eine awesome-4a24b21e22bc042a. Wenn ein Programm ausgeführt wird, wird dieser Satz von Tests ausgeführt. Alle Rust-Tests funktionieren so - es wird eine ausführbare Datei generiert, deren Ausführung (eventuell mit den richtigen Befehlszeilenflags) den Test ausführt.

Diese ausführbare Datei ist, was Sie in GDB oder LLDB debuggen müssen:

$ 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

Dies vermeidet Ladung verwendet wird, die die meisten Menschen zu tun, nicht zu wollen, gehen zu. Der wichtige Aspekt dieser Zeile ist das Flag -g, das den Compiler anweist, Debuginformationen hinzuzufügen. cargo build oder cargo test kompilieren standardmäßig im Debugging-Modus. Sie können auch build your tests in release mode.

+0

Also in jedem Fall die Test-Datei in Target/Debug ist in der Lage zu debuggen? – xetra11

+0

@ Xetra11 die in 'target/debug' erzeugten ausführbaren Dateien können debugged werden, ja. – Shepmaster