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.*'
Weder '(gdb) rbreak 'rost-gdb-test :: main. *'' Noch '(lldb) br gesetzt -r 'rost-gdb-test :: main. *'' Setze irgendwelche Haltepunkte für mich. –
@andreyg aktualisiert. – Shepmaster