1 Punkte von GN⁺ 2024-07-22 | 1 Kommentare | Auf WhatsApp teilen
  • Einführung in rr

    • rr ist ein Debugging-Werkzeug für C/C++ unter Linux und soll gdb ergänzen
    • Ein Fehler kann einmal aufgezeichnet und diese Aufzeichnung anschließend wiederholt debuggt werden
    • Debugging ist möglich, indem dieselbe Ausführung jedes Mal reproduziert wird
    • Bietet effiziente Rückwärtsausführung über gdb
  • Funktionen von rr

    • Geringer Overhead
    • Unterstützt Aufzeichnung und Wiedergabe verschiedener Anwendungen (Firefox, Chrome, QEMU, LibreOffice usw.)
    • Kann Multi-Prozess-Workloads aufzeichnen, wiedergeben und debuggen
    • Unterstützt gdb-Scripting und IDE-Integration
    • Robuste und komprimierte Trace-Dateien, zwischen Maschinen übertragbar
    • Bietet einen Chaos-Modus zur Reproduktion intermittierender Bugs
  • Debugging-Erlebnis mit rr

    • Anwendung aufzeichnen: rr record /your/application --args...
    • Aufgezeichnete Ausführung debuggen: rr replay
    • Die aufgezeichnete Spur deterministisch debuggen
    • Übliche gdb-Befehle können verwendet werden
    • Mit Rückwärtsausführung schnell zur Problemstelle gelangen
  • Videos

    • Demo-Video zur Aufzeichnung und Wiedergabe von Firefox
    • Video mit ausführlicher Erklärung der Grundfunktionen von rr
    • Video eines fortgeschrittenen Technikvortrags von Robert O'Callahan
  • Erste Schritte

    • Aus dem Quellcode bauen: empfohlen, falls Pakete nicht funktionieren
    • Installationsanleitungen für Fedora und Ubuntu verfügbar
  • Hintergrund und Motivation

    • Entwickelt, um das Debuggen intermittierender Fehler zu erleichtern
    • Durch deterministische Wiedergabe bleiben im Debugging-Prozess gewonnene Informationen gültig
    • Rückwärtsausführung macht den Debugging-Prozess einfacher
    • rr wird regelmäßig in vielen großen und kleinen Projekten eingesetzt
  • Wie rr funktioniert

    • Zeichnet Linux-User-Space-Prozesse auf und erfasst alle Eingaben vom Kernel
    • Garantiert bei der Wiedergabe Kontrollfluss auf Befehlsebene sowie Speicher- und Registerinhalte
    • Speicherlayout, Objektadressen, Registerwerte usw. bleiben identisch
    • Noch leistungsfähiger in Kombination mit Fuzzern und zufälligen Fault-Injection-Tools
  • Der Kontext von rr

    • Record-and-Replay-Debugging ist eine alte Idee
    • Entwurfsziele mit Fokus auf Firefox
    • Verteilbarkeit: läuft auf gewöhnlichen Linux-Kernels, keine Änderungen an der Systemkonfiguration erforderlich
    • Geringer Laufzeit-Overhead
    • Einfaches Design: vermeidet komplexe Techniken
  • Einschränkungen

    • Emuliert eine Single-Core-Maschine
    • Kann keine Prozesse aufzeichnen, die Speicher mit Bereichen außerhalb des Aufzeichnungsbaums teilen
    • Erfordert eine moderne x86-CPU oder bestimmte ARM-CPUs
    • Benötigt Kenntnis aller Systemaufrufe, die von den aufgezeichneten Prozessen ausgeführt werden
    • Erfordert Anpassungen an Kernel-Änderungen, Updates von Systembibliotheken und neue CPU-Familien
  • Weiterführende Materialien

    • Erweiterter technischer Bericht
    • rr-Wiki
    • Fragen sind über die Mailingliste oder in #rr auf chat.mozilla.org möglich

Zusammenfassung von GN⁺

  • rr ist ein leistungsstarkes Werkzeug für C/C++-Debugging unter Linux und verbessert durch deterministische Wiedergabe die Effizienz des Debuggings erheblich
  • Es unterstützt verschiedene Anwendungen und Multi-Prozess-Workloads und ist dank des geringen Overheads praktisch einsetzbar
  • Die Rückwärtsausführung erleichtert den Debugging-Prozess zusätzlich
  • Es kann komplexe Anwendungen wie Firefox debuggen und ist daher allgemein nützlich
  • Ähnliche Werkzeuge mit vergleichbaren Funktionen sind gdb und Valgrind

1 Kommentare

 
GN⁺ 2024-07-22
Hacker-News-Kommentare
  • GDB bietet bereits Reverse-Debugging
  • rr bietet mehr Funktionen und Flexibilität
  • rr wurde erfolgreich verwendet, um große Codebasen rückzuentwickeln
  • Ein Debugger erfordert Verständnis für Symbollisten und Systemaufrufe
  • Es wird gefragt, ob rr auch mit Sprachen wie Rust, Zig, Odin und Nim funktioniert
  • Bei speicherverwalteten Sprachen wie Python, JS und C# wird es vermutlich nicht funktionieren
  • Es gab ein Projekt, das einen Port nach Rust versuchte, wurde aber eingestellt
  • Eine Vergleichsstudie zu den Auswirkungen und Vorteilen einer Umschreibung von C++ nach Rust wäre interessant
  • rr ist sehr nützlich, kann aber häufig nebenläufige Bugs nicht reproduzieren
  • Es wäre sehr nützlich, wenn einige Sprachen rr direkt in ihre Toolchain integrieren würden
  • Debugging von C/C++ mit rr ist sehr leistungsfähig und verbessert den Debugging-Prozess erheblich
  • Pernosco basiert auf rr und ergänzt eine abfragbare Datenbank der gesamten Programmausführung
    • Wenn man auf einen falschen Wert klickt, erklärt es sofort, woher dieser Wert kam
    • Man kann den Debugger fragen, was tatsächlich passiert ist, ohne den Code verstehen zu müssen
  • Es wird gefragt, ob es auch nutzbar ist, wenn C/C++-Code als von Python aufgerufene dll/so kompiliert wurde
  • Es wird gefragt, ob die Probleme von rr mit Ryzen-CPUs behoben wurden