2016-07-16 9 views
2

zusammengestellt Debuggen Ich versuche, diese zu Schritt durch:kann nicht einen Haltepunkt auf der Haupt setzen, während ein Programm mit Rust 1.10 mit GDB

fn main() { 
    println!("Hello {}", 0); 
} 

Ich habe versucht, mit beiden kompilieren: cargo build und rustc -g -L src/main.rs

Ich führe dann gdb target/debug/rust-gdb-test (oder gdb main) aus und versuche einen Haltepunkt auf main mit break main zu setzen.

(break ::rust-gdb-test::main gibt Function "::rust-gdb-test" not defined. zurück).

Nach dem Bruch (Breakpoint 1, 0x0000555555559610 in main()), wenn ich versuche, list zu laufen, erhalte ich:

1 dl-debug.c: No such file or directory. 

I Rust läuft am 1.10.0 (cfcb716cf 2016-07-03) und GDB 7.7.1 (Debian 7.7.1+dfsg-5).

Ein similar question wurde vor 2 Jahren gestellt, aber ich konnte die dort vorgestellten Lösungen nicht zum Funktionieren bringen.

Antwort

1

Hinweis: Ich habe anscheinend keine GDB mehr installiert, nur LLDB, aber für diese Frage ist die Antwort die gleiche.

Die main, die Sie in Rust sehen, ist nicht das gleiche main, das in der kompilierten Binärdatei existiert. Insbesondere gibt es eine Anzahl von Shim-Methoden zwischen den beiden. Der Rust main enthält tatsächlich die Kiste Namen (in meinem Beispiel buggin) und einen Hash (in meinem Fall hfe08615ed561bb88):

* frame #0: 0x000000010000126d buggin`buggin::main::hfe08615ed561bb88 + 29 at main.rs:2 
    frame #1: 0x000000010000810e buggin`std::panicking::try::call::hbbf4746cba890ca7 + 30 
    frame #2: 0x000000010000aadc buggin`__rust_try + 12 
    frame #3: 0x000000010000aa76 buggin`__rust_maybe_catch_panic + 38 
    frame #4: 0x0000000100007f32 buggin`std::rt::lang_start::hbcefdc316c2fbd45 + 562 
    frame #5: 0x00000001000013aa buggin`main + 42 
    frame #6: 0x00007fff910435ad libdyld.dylib`start + 1 
    frame #7: 0x00007fff910435ad libdyld.dylib`start + 1 

Hier können Sie sehen, dass main ein paar Frames entfernt in dem Stapel ist.

Ich neige dazu, einen Platzhalter Breakpoint zu verwenden, nicht mit dem Hash zu behandeln:

(lldb) br set -r 'buggin::main.*' 
Breakpoint 5: where = buggin`buggin::main::hfe08615ed561bb88 + 29, address = 0x000000010000126d 

rbreak sollte ein Äquivalent in GDB sein.

Sobald das Programm gestoppt ist, sollten Sie in der Lage sein, die Quelle zu sehen. Sie könnten sich auch für die walkerund walker30003 interessieren, die mit Rust geliefert werden und die erfahrung ein wenig verbessern.

Dies ist im Grunde das gleiche wie this answer, erwähnt aber den Hash.

Weder (gdb) rbreak 'rust-gdb-test::main.*' noch (lldb) br set -r 'rust-gdb-test::main.*' für mich keine Haltepunkte setzen.

Der Bindestrich (-) ist kein gültiges Symbol. Wenn es kompiliert wird, wird es in einen Unterstrich konvertiert.

Meine ursprüngliche Methode war eigentlich diese:

(lldb) br set -r '.*main.*' 
Breakpoint 2: 67 locations. 

Anschließend können Sie das Programm starten und ein paar Mal weiter, bis Sie den richtigen Platz zu finden. Haben Sie keine Angst, hineinzugehen und ein bisschen zu erkunden; es ist nur ein Debugger!

Sie könnten verschiedene Versionen der Regex zu sehen, ob etwas Interessantes passen könnte:

(lldb) br set -r '.*main::.*' 
Breakpoint 3: where = rust-gdb-test`rust_gdb_test::main::h97d2ac6fea75a245 + 29, 
(lldb) br set -r '.*::main.*' 
Breakpoint 4: where = rust-gdb-test`rust_gdb_test::main::h97d2ac6fea75a245 + 29, 

Sie könnten auch aus main eine Funktion mit einem sehr eindeutigen Namen nennen und einen Haltepunkt auf, dass ein:

(lldb) br set -r '.*a_really_unique_name.*' 
+0

Weder '(gdb) rbreak 'rost-gdb-test :: main. *'' Noch '(lldb) br gesetzt -r 'rost-gdb-test :: main. *'' Setze irgendwelche Haltepunkte für mich. –

+0

@andreyg aktualisiert. – Shepmaster