1 ポイント 投稿者 GN⁺ 2024-07-22 | 1件のコメント | WhatsAppで共有
  • rr の紹介

    • rr は Linux 向けの C/C++ デバッグツールで、gdb を補完することを目的としている
    • 失敗を一度記録し、その記録を繰り返しデバッグできる
    • 毎回同じ実行を再現してデバッグ可能
    • gdb を通じて効率的な逆方向実行を提供
  • rr の機能

    • 低オーバーヘッド
    • さまざまなアプリケーションの記録と再生をサポート(Firefox、Chrome、QEMU、LibreOffice など)
    • マルチプロセスのワークロードを記録、再生、デバッグ可能
    • gdb スクリプティングおよび IDE 統合をサポート
    • 耐久性があり圧縮されたトレースファイルで、マシン間で移動可能
    • 断続的なバグを再現するためのカオスモードを提供
  • rr デバッグ体験

    • アプリケーションの記録: rr record /your/application --args...
    • 記録された実行をデバッグ: rr replay
    • 記録済みトレースを決定論的にデバッグ
    • 一般的な gdb コマンドを使用可能
    • 逆方向実行によって問題箇所へ素早く移動可能
  • 動画

    • Firefox の記録・再生デモ動画
    • rr の基本機能を詳しく説明する動画
    • Robert O'Callahan による高度な技術講演動画
  • はじめに

    • ソースからビルド: パッケージが動作しない場合に推奨
    • Fedora および Ubuntu でのインストール方法を提供
  • 背景と動機

    • 断続的な失敗のデバッグを容易にするために開発
    • 決定論的再生により、デバッグ過程で得た情報の有効性が維持される
    • 逆方向実行により、デバッグ作業がより容易になる
    • rr は多くの大規模・小規模プロジェクトで定期的に使われている
  • rr の動作方式

    • Linux ユーザー空間プロセスを記録し、カーネルからのすべての入力をキャプチャ
    • 再生時には命令レベルの制御フロー、メモリ、レジスタ内容を保証
    • メモリレイアウト、オブジェクトアドレス、レジスタ値などが同一に保たれる
    • ファザーやランダム障害注入ツールと併用するとさらに強力になる
  • rr の文脈

    • 記録・再生デバッグは古くからあるアイデア
    • Firefox に重点を置いた設計目標
    • 配布可能性: 一般的な Linux カーネル上で動作し、システム構成の変更が不要
    • 低いランタイムオーバーヘッド
    • シンプルな設計: 複雑な技術を回避
  • 制限事項

    • 単一コアマシンをエミュレート
    • 記録ツリー外とメモリを共有するプロセスは記録不可
    • 最新の x86 CPU または特定の ARM CPU が必要
    • 記録対象プロセスが実行するすべてのシステムコールに関する知識が必要
    • カーネル変更、システムライブラリ更新、新しい CPU ファミリへの対応が必要
  • 追加参考資料

    • 拡張技術レポート
    • rr Wiki
    • メーリングリストまたは chat.mozilla.org の #rr で質問可能

GN⁺ のまとめ

  • rr は Linux での C/C++ デバッグ向けの強力なツールで、決定論的再生によってデバッグ効率を大きく向上させる
  • 多様なアプリケーションとマルチプロセスワークロードをサポートし、低オーバーヘッドで実用的
  • 逆方向実行機能により、デバッグ作業がさらに容易になる
  • Firefox のような複雑なアプリケーションもデバッグでき、汎用的に有用
  • 類似機能を持つツールとしては gdb や Valgrind がある

1件のコメント

 
GN⁺ 2024-07-22
Hacker Newsのコメント
  • GDBはすでにリバースデバッグ機能を提供している
  • rrはより多くの機能と柔軟性を提供する
  • rrを使って大規模なコードベースをリバースエンジニアリングすることに成功した
  • デバッガにはシンボル一覧とシステムコールの理解が必要
  • rrがRust、Zig、Odin、Nimのような言語でも動作するのか気になる
  • Python、JS、C#のようなガベージコレクション言語では動作しないだろう
  • Rustへの移植を試みたプロジェクトがあったが中止された
  • C++からRustへの書き換えの影響と利点に関する比較研究は興味深いだろう
  • rrは非常に有用だが、並行性バグを再現できないことが多い
  • 一部の言語がrrをツールに直接統合すれば非常に有用だろう
  • rrを使ったC/C++デバッグは非常に強力で、デバッグ作業を大きく改善する
  • Pernoscoはrrをベースに、プログラム実行全体のクエリ可能なデータベースを追加している
    • 誤った値をクリックすると、その値がどこから来たのかを即座に説明してくれる
    • コードを理解していなくても、デバッガに実際に何が起きたのかを尋ねられる
  • C/C++コードがPythonから呼び出されるdll/soとしてコンパイルされている場合でも使えるのか気になる
  • rrのRyzen CPU関連の問題が解決されたのか気になる