BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Live Recorder: 非決定的データのキャプチャとリプレイを使用したC++、Rust、Goのデバッグ

Live Recorder: 非決定的データのキャプチャとリプレイを使用したC++、Rust、Goのデバッグ

原文(投稿日:2019/12/15)へのリンク

今年初め、Undoチームは、アプリケーションのデバッグ実行内のあらゆる非決定性データのキャプチャを可能にする同社の"ソフトウェア・フライトレコーダ・テクノロジ"の最新版を、C/C++、Rust、Goアプリケーションに適用した"Live Recorder 5"をリリースした。キャプチャしたレコードによって、アプリケーションの全メモリとレジスタ状態の再生が可能になることにより、実行ステップのリプレイ、前進、後退が、UndoDBデバッガ経由でサポートされる。先日のQCon San FramciscoカンファレンスでInfoQは、Undoの創業者のひとりでCTOのGreg Law博士から、その詳細情報を聞くことができた。

Undo Webサイトに述べられているように、断続的なソフトウェアエラーのデバッグは、開発、テスト、運用のいずれの段階においても、エンドユーザとエンジニアの両方にとって欲求不満を覚えるものである。C++やGoなどの言語用の最新のデバッガは、総じて機能は豊富だが、バグの再現に必要な、関連する非決定的外部イベントをすべてキャプチャしていないため、実行中のプロセスをリニアにデバッグすることしかできない。

モックやスタブを使って外部イベントのシミュレートや決定性の追加をしたり、デバッグセッション内でアプリケーションを複数回実行することはもちろん可能だが、これらのアプローチはオーバーヘッドを伴ったり、構成が複雑であったり、時間を要したりする。

UndoのLive Recordは、すべての非決定的データをインストラクションのレベルまですべてキャプチャし、これを使ってアプリケーションの完全な状態を再生することが可能である。この記録プロセスによって、ターゲットアプリケーションの実行速度は、一般的に2~5分の1にスローダウンする。Live Recorderは障害の発生するプロセスの記録のみを目的としており、プロファイラや他の監視ツールのように常時実行することを意図したものではないのだ。

データキャプチャは最適化されているため、メモリ内にストアすることも可能で、プログラム全体のメモリとレジスタ状態を最小のオーバーヘッドで再生することができる。記録したデータをファイルに永続化して、エンジニア間で共有することも可能だ。可逆的(reversible)デバッガも統合されているので、後方向と前方向にリプレイして記録内容をデバッグすることもできる。

 

UndoのLive Recorder
画像はLive Recorder Datasheet (PDF)より

InfoQとの議論の中でLaw氏は、Live Recorderの使用をメトリクスの発行やロギングの代用として見るべきではない、という点を明確に説明した。Live Recorderは、アプリケーション内の障害や支障の存在をエンジニアに警告するためのものではない。そのような目的には、メトリックの収集と分析、例外処理コード、警告ツールといったものを活用した方がよい結果が得られる。ロギングも同じように、アプリケーション内の任意の実行ポイントにおいて発生している、あるいは発生すべき事象に関して、より多くのコンテキストを提供するために用いられる。

ビジネス上の問題、あるいはその基盤となるアルゴリズムに付加的なコンテキストを提供するものとして、ロギングは有用な存在です。ロギングは"分かっていることを述べる"ことができます。例外やスタックトレースは"何が悪かったのか"について、手がかりを与えてくれます。しかしながらエンジニアとしては、問題が発生したシナリオを単純に再現して、問題のメンタルモデルや根本原因をステップ・バイ・ステップで構築したい場合も少なくないはずです。

そして氏は、Live Recorderは、エンジニアがそれまで考えもしなかったバグを検出し修正することを可能にする、すなわち"未知の未知(unknown unknowns)"を解決する手ががりを与えてくれることを目指している、と説明した。さらに氏は、バグの原因を理解することの困難さについて、X軸をバグの出現頻度、Y軸をバグの再現性とした場合の2次グラフによってモデル化できる、と述べた。Live Recorderはこのグラフの右下、すなわち、最も頻度が大きく、従来のデバッグテクニックでは最も再現が難しい位置において優位性を示すのである。

問題をキャプチャした記録ファイルが生成されれば、Live Recordの"可逆的(reversible)デバッガ"であるUndoDBを使った実行履歴の解析が可能になる。UndoDBはGNUプロジェクトのデバッガGDBがベースで、C/C++、Rust、Adaなど、GDBがサポートする言語で記述されたアプリケーションのソースレベルデバッグをサポートし、変数とメモリのインスペクション、スクリプティング、条件付きブレークポイントとウォッチポイントといったデバッガに期待されるすべての機能に加えて、アプリケーションの前方向すべてと後方への実行を可能にする。その他の機能は次のようなものだ。

  • マルチプロセッサ相関(multi-process correlation) — プロセスやスレッドが共有メモリ上のデータ構造を操作した順序を明らかにする。
  • スレッドファジング(thread fuzzing) — スレッド実行を乱数化して、レースコンディションなどマルチスレッドに関わる障害を明らかにする。
  • インテグレーション — API、CLI、フロントエンド、コンテナプラットフォームのインテグレーション。
  • コンパイラおよびライブラリ非依存 — 特別なライブラリを用いてアプリケーションを再コンパイルないしリンクする必要はない。

Live Record 5.0はKUbernetesおよびDockerのコンテナ個々の実行を記録し、再生することもできるため、マイクロサービス環境における障害を短時間で解決する支援となる、とLaw氏は言う。

現時点ではLinux x86およびx86_64上で動作するC/C++、Go、Rust、Adaアプリケーションがサポート対象で、近くJavaがサポートされる予定である。一般的なすべてのLinuxディストリビューションに適応し、カーネルを変更する必要はない。

この記事に星をつける

おすすめ度
スタイル

BT