Schritt für Schritt interaktiver Debugger für Rust?

80

Wie kann ich die Rust-Anwendung Schritt für Schritt interaktiv debuggen, wie ich es mit "pry" in Ruby tun kann?

Ich möchte in der Lage sein, die Variablen in Echtzeit zu sehen und vorzugsweise zu ändern, wenn ich einen Haltepunkt erreiche. Gibt es ein produktionsfertiges Projekt?

Matthieu M.
quelle
Sie können GDB verwenden. Abgesehen davon arbeite ich an einem Stepper für MIR (implementiert auf miri), mit dem Sie auf einer Art virtueller Maschine debuggen können.
oli_obk
@ker: Oh! Ist miri schon kurz vor dem Abschluss? Ich dachte, es sei noch im Anfangsstadium.
Matthieu M.
@MatthieuM.: Es gibt noch einige Dinge, die noch nicht funktionieren (z. B. Funktionszeiger), aber es kommt langsam dahin.
oli_obk
2
Dies wurde auf Reddit
Shepmaster
4
@Dimon Es wird als Stack Overflow (und Reddit) Etikette angesehen, um zukünftige Suchende über andere Orte zu informieren, dass eine Antwort gefunden werden kann. Auf diese Weise haben sie eine bessere Chance, nützliche Informationen zu erhalten. Dies spart einem Antwortenden möglicherweise auch Zeit, wenn das, was er sagen wollte, bereits an einem anderen Ort behandelt wird.
Shepmaster

Antworten:

52

Ich finde ein gutes Maß an Benutzerfreundlichkeit mit VS Code und der CodeLLDB- Erweiterung:

  1. Installieren Sie VS Code
  2. Suchen und installieren Sie die Erweiterung Rust oder den neueren Rostanalysator in VS Code
  3. Überprüfen Sie die Anforderungen und richten Sie CodeLLDB für Ihre Plattform ein
  4. Suchen und installieren Sie die Erweiterung CodeLLDB in VS Code
  5. Der LLDB-Debugger hat den Hauptmenüpunkt "Debug" hinzugefügt, von dem aus der Debugger gestartet werden kann. Wenn das Debuggen zum ersten Mal gestartet wird, müssen Sie die Umgebung (den Debugger) auswählen: Wählen Sie LLDB.
  6. Wenn Sie LLDB auswählen, wird eine launch.jsonDatei geöffnet. Wenn nicht, öffnen Sie sie im .vscodeOrdner
  7. Du launch.jsonsolltest so aussehen:

    {
        // Use IntelliSense to learn about possible attributes.
        // Hover to view descriptions of existing attributes.
        // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "type": "lldb",
                "request": "launch",
                "name": "Debug",
                "program": "${workspaceRoot}/target/debug/hello_world",
                "args": [],
                "cwd": "${workspaceRoot}/target/debug/",
                "sourceLanguages": ["rust"]
            }
        ]
    }
    
  1. Wenn Sie die Dinge generisch halten und nur eine Binärdatei kompilieren möchten, die dem Namen des Frachtordners entspricht, können Sie den Schlüssel "program" durch die Variablensubstitution $ {workspaceRootFolderName} verwenden:

    {
        "version": "0.2.0",
        "configurations": [
            {
                "type": "lldb",
                "request": "launch",
                "name": "Debug",
                "program": "${workspaceRoot}/target/debug/${workspaceRootFolderName}",
                "args": [],
                "cwd": "${workspaceRoot}/target/debug/",
                "sourceLanguages": ["rust"]
            }
        ]
    }
    

Hier sind einige Blog-Beiträge zu Rust und VS Code:

Cirelli94
quelle
Gute Antwort! Es wäre großartig, wenn Sie erklären könnten, warum Sie diese Blog-Beiträge hinzugefügt haben, und möglicherweise einen Absatz zitieren, um ihre Relevanz zu verdeutlichen.
Kyll
Nun, ich habe diese Beiträge als echten Fall hinzugefügt!
Cirelli94
26

Der Rust-Compiler erstellt native Binärdateien mit nativen Debug-Informationen (Symbolinformationen), sodass jeder native Debugger dies tun kann. Das bedeutet gdbund lldb, oder die Windows-Debugger (WinDBG oder nur Visual Studio), wenn Sie die MSVC ABI-Version von Rust verwenden. Wenn Sie eine integrierte Erfahrung wünschen, ist RustDT der richtige Weg (Setup unter Windows: Wie richte ich GDB für das Debuggen von Rust-Programmen in Windows ein? ). Bitte beachten Sie, dass Sie wahrscheinlich auf Folgendes stoßen: Wie kann ich beim Debuggen von MSVC ABI Rust-Programmen Variablenwerte überprüfen? unter Windows und https://github.com/rust-lang/rust/issues/33062 auf einem Mac.

Zyniker
quelle
2
Und mit gdb 7.12gibt es jetzt die richtige Unterstützung, nicht nur "funktioniert, weil es auf native kompiliert ist".
Domen
7

Für einen grafischen Debugger gibt es gdbgui . Es ist für Linux, Windows und MacOS verfügbar. Es verwendet den Browser als Anzeige und zur Interaktion mit dem Debugger.

psiphi75
quelle
3
Wenn ich mir selbst antworte, obwohl gdbgui nützlich ist, habe ich festgestellt, dass der VS Code-Debugger jetzt sehr gut funktioniert.
Psiphi75
2

Ich habe gdb 7.11 und der Befehl rust-gdb scheint im Vergleich zum nativen gdb mehr rostrelevante Informationen zu liefern. Zum Beispiel zeigt rust-gdb Rostobjekte korrekt mit vollständigen Namen an, und gdb zeigt sie einfach nicht an.
Im folgenden Beispiel würde gdb nun alle fett gedruckten Teile anzeigen.

$ 1 = Args = {inner = ArgsOs = {inner = Args = {iter = IntoIter = {buf = NonNull = {pointer = NonZero <* const std :: ffi :: os_str :: OsString> = {0x7ffff6c20060}}, phantom = PhantomData , cap = 1, ptr = 0x7ffff6c20060, end = 0x7ffff6c20078}, _dont_send_or_sync_me = PhantomData <* mut ()> }}}

Otuk
quelle