
デバッガとは、プログラムレベルの検査と制御が可能な環境でコンピュータプログラムを実行するためのソフトウェアです。デバッガはデバッグによく使用されますが、テストなど他の目的にも使用できます。デバッガの一般的な機能には、コードを1行ずつステップ実行すること、プログラムの制御フローに介入すること、ブレークポイントを管理すること、メモリのレポートと変更を行うことなどがあります。
ソースレベルデバッガ(別名:シンボリックデバッガ)は、プログラムのソースコードを統合したユーザーエクスペリエンスを提供します。通常、このようなデバッガは、プログラムの実行ポイントに対応するソースコードの行を示し、ソースコードのシンボルを介してメモリの読み書きを可能にします。一方、低レベルデバッガ(別名:マシン語デバッガ)は、実行ポイントをマシンコードまたは関連するアセンブリ言語として表示し、アドレスによるメモリアクセスのみを可能にします。
検証対象のコードは、命令セットシミュレータ(ISS)上で実行される場合もあります。この手法は、特定の条件に遭遇した際に停止できるという大きな利点がありますが、通常、適切な(または同一の)プロセッサ上でコードを直接実行するよりも若干遅くなります。一部のデバッガは、この影響を軽減するために、完全シミュレーションと部分シミュレーションの2つの動作モードを提供しています。
デバッガは通常、最上位レベルでクエリプロセッサ、シンボル解決器、式解釈器、デバッグサポートインターフェイスを提供します。[ 1 ]デバッガは、プログラムをステップ実行(シングルステップ実行またはプログラムアニメーション)、ブレークポイントを使用して特定のイベントまたは指定された命令で停止(ブレーク)(現在の状態を調べるためにプログラムを一時停止)、変数の値の追跡など、より高度な機能も提供します。[2] デバッガによっては、実行中のプログラムの状態を変更する機能があります。クラッシュや論理エラーを回避するために、プログラムの別の場所で実行を継続することも可能です。
デバッガがバグ修正に役立つのと同じ機能により、コピープロテクション、デジタル著作権管理、その他のソフトウェア保護機能を回避するためのソフトウェアクラッキングツールとしても使用できます。また、特に命令パスの長さが表示される場合は、一般的な検証ツール、障害カバレッジ、パフォーマンスアナライザーとしても役立つことがよくあります。 [ 3 ]
gdbやdbxといった主流のデバッグエンジンは、コンソールベースのコマンドラインインターフェースを提供しています。デバッガフロントエンドは、IDEとの統合、プログラムのアニメーション表示、視覚化機能などを提供する、デバッガエンジンの一般的な拡張機能です。
プログラムがデバッガで実行されているときに、プログラミング上のバグや無効なデータが原因で例外が発生すると、デバッガにその例外が通知されます。プログラムが「トラップ」されるか、あらかじめ設定された条件に達すると、ソースレベルデバッガまたはシンボリックデバッガの場合は、通常、元のコード内の該当箇所が表示されます。低レベルデバッガまたはマシン語デバッガの場合は、逆アセンブリ内の該当行が表示されます(ただし、元のソースコードにオンラインでアクセスでき、アセンブリまたはコンパイルされたコードから適切なセクションを表示できる場合は除きます)。
記録再生デバッグ[ 4 ]は、「ソフトウェア飛行記録」または「プログラム実行記録」とも呼ばれ、プログラムの各命令が実行されるたびにアプリケーションの状態変化をキャプチャしてディスクに保存します。記録された内容は再生して対話的にデバッグすることで、欠陥を診断して解決できます。記録再生デバッグは、リモートデバッグや、断続的、非決定論的、その他再現が困難な欠陥の解決に役立ちます。
デバッガの中には、「逆デバッグ」と呼ばれる機能を持つものがあります。これは「履歴デバッグ」または「後方デバッグ」とも呼ばれます。これらのデバッガを使用すると、プログラムの実行を時間的に遡って実行できます。さまざまなデバッガにこの機能があります。Microsoft Visual Studio (2010 Ultimate エディション、2012 Ultimate、2013 Ultimate、および 2015 Enterprise エディション) は、C#、Visual Basic .NET、およびその他の言語向けに IntelliTrace 逆デバッグを提供していますが、C++ には対応していません。C、C++、Java、Python、Perl、およびその他の言語向けにも逆デバッガが存在します。オープンソースのものもあれば、商用ソフトウェアもあります。一部の逆デバッガはターゲットの処理速度を桁違いに低下させますが、最も優れた逆デバッガは 2 倍以下の速度低下にとどまります。逆デバッグは特定の種類の問題には非常に役立ちますが、一般的には使用されていません。[ 5 ]
リバースデバッガーの機能に加えて、タイムトラベルデバッグでは、ユーザーがプログラムと対話したり、必要に応じて履歴を変更したり、プログラムがどのように反応するかを観察したりすることもできます。
デバッガーの中には、特定の単一言語のみを扱うものもあれば、複数の言語を透過的に処理できるものもあります。例えば、メインのターゲットプログラムがCOBOLで記述されていて、アセンブリ言語のサブルーチンやPL/1のサブルーチンを呼び出す場合、デバッガーは言語の変更に合わせて動的にモードを切り替える必要があるかもしれません。
デバッガの中には、バッファオーバーフローなどのストレージ違反を回避するためにメモリ保護機能を組み込んでいるものもあります。これは、タスクごとにメモリ「プール」からメモリが動的に割り当てられるトランザクション処理環境において、非常に重要となる場合があります。
一部のプロセッサには、トラップフラグなどのプログラムを1ステップ実行するためのハードウェアサポートがあります。
最新のマイクロプロセッサのほとんどは、デバッグを容易にするために、 CPU設計に少なくとも以下の機能のいずれかを備えています。
最も高性能で人気のあるデバッガーの中には、移植性を最大限に高め、リソース消費を最小限に抑えるために、シンプルなコマンドラインインターフェイス(CLI)のみを実装しているものもあります。開発者は通常、グラフィカルユーザーインターフェイス(GUI)を介したデバッグの方が簡単で生産的だと考えています。これが、ユーザーがグラフィカルユーザーインターフェイスを介して従属的なCLI専用デバッガーを監視および制御できるようにするビジュアルフロントエンドが存在する理由です。GUIデバッガーフロントエンドの中には、さまざまなCLI専用デバッガーとの互換性を考慮して設計されているものもあれば、特定のデバッガーのみを対象としているものもあります。
デバッグは、ソフトウェアの不正なクラックや海賊版作成によく利用されますが、悪意がなくても通常は違法行為です。クラックミーとは、クラックやデバッグを目的として特別に設計されたプログラムです。これらのプログラムを利用することで、デバッガーを持つユーザーは、法的トラブルに巻き込まれることなくデバッグ能力を磨くことができます。