デバッガ

デバッガ（）とは、デバッグ作業を支援するコンピュータプログラムのこと。利用者がデバッグ対象プログラムを対話的に動作／一時停止させたり、プログラムが使っている変数の一覧や内容等を表示させたりする機能がある。では統合開発環境に含まれていることが多い。また、インサーキット・エミュレータ (ICE) などでは、ハードウェアと連携して動作する。「デバッガー」と表記することもある。また、デバッグを行なう作業者のことをデバッガあるいはデバッガーと呼ぶこともあるが、プログラムとしてのデバッガは「人間が行うデバッグ作業を支援するプログラム」であり、「自立的にデバッグを行ってくれるプログラム」というわけではない。

インタプリタには内蔵されていることもある。たとえばPerlは起動時に -d オプションを指定することで、デバッガモードになる。

概要
デバッガの目的
ソフトウェアを設計・開発する際、プログラム作成開始段階では少なからず誤り（エラーあるいはバグ）が含まれており、設計どおりに動作しなかったり、出力結果が不正確だったりすることが多い。そのため、ソフトウェアのテスト実行をしつつ、正しい動作をするようにプログラムを修正し、不具合の原因となるバグを取り除いていく作業、すなわちデバッグを行なう必要がある。古典的かつ原始的な手法としては、ソースコードを1行ずつ目視で検査（コードレビュー）しながら思考実験により論理的な誤りを見つけ出す方法が挙げられる。また典型的には、標準出力などを利用して実際の変数の状態やプログラム実行順序などを時系列に表示しつつ、プログラム動作および不具合再現手順や発生タイミングを確認する技法が用いられることも多い。C言語のprintf関数にちなんで、この手法を「printfデバッグ」と呼ぶこともある。プログラムのテスト実行によって、ソースコードの流れ、および変数などの中身を確認しながら、その動作の問題点を探ることになる。これにより、変数の取り扱いや計算式、条件分岐などにおける誤りを見つけ出し、修正していく。

しかし、ソフトウェアの規模が大きくなるにつれて、通例バグの数も比例して増え、複雑で大規模なプログラムにおいて不具合の原因がどこに存在するのかを特定することが困難になっていく。標準出力が使えない環境や、ログが瞬時に流れてしまうようなケースではprintfデバッグ技法は適用しにくい。また、本来は必要のないデバッグ用の余分な出力処理を埋め込むことで、ソースコードのメンテナンス性が低下するだけでなく、システムに対する副作用が発生してタイミングがずれるなどして、再現させたいはずの不具合が発生しなくなってしまうこともある。複雑なデータ構造や膨大なデータ列など、単純にテキストで表現することが難しいケースもある。

そこで、プログラミングツールのひとつであるデバッガを利用して、テスト実行やデバッグの効率化および負担軽減を行なうようになった。デバッガを用いることで、前述の思考実験やprintfデバッグでは難しかった、高度な実行時検証をすることができるようになる。

デバッガの原理は、デバッグ対象のプロセスにアタッチして、プロセスの実行状況に関する情報の双方向通信を行なうことである。オペレーティングシステムにはデバッガの実装に利用可能なAPIが用意されていることもある。コンパイルすると、（人間には理解しにくい）機械語や中間表現になるプログラミング言語であっても、デバッグ用にコンパイル＆ビルドする際に、ソースコードに関するメタデータである「プログラムデータベース」(program database; pdb) と呼ばれる追加情報を生成し、デバッグ実行時にこのシンボル情報を参照することで、デバッガは現在実行中のプログラムステップ位置などを特定することができる。

デバッガは性能解析および性能強化にも使われることがあるが、これらは本来プロファイラと呼ばれる別のツールの役割である。デバッグ用にコンパイル＆ビルドされたプログラムは、余分なコードや最適化されていないコードを含んでおり、プログラム本来の性能指標としては使うべきではない。また、プログラムにデバッガをアタッチすることでオーバーヘッドを生じることもある。

デバッガの機能
多くのデバッガは、大体似たような機能を持つ。

ブレークポイント
ソースコード中の任意のステップに置くことで、実行の流れを一時的に止める機能。ブレークポイントを置いてからデバッグ対象のソフトウェアを実行した際、デバッガはブレーク位置でプログラムの処理を一時停止させる。これにより、任意の位置での実行状況（変数の値やメモリの内容）を調べることができるようになる。一時停止後に通常通り実行を再開することもできる。
ステップ実行
処理を止めた後で、1ステップずつ対話的にソースコードを実行する。これにより、ソースコードをステップごとに追いかけながら実行することができ、状態の変化の確認やロジックの問題点を探ることができる。
ステップイン
ステップを関数（サブルーチン）あるいはメソッドの内部に進める。
ステップオーバー
現在実行中の関数（サブルーチン）あるいはメソッドにおいて1ステップ進める。
ステップアウト
現在実行中の関数（サブルーチン）あるいはメソッドの実行を最後まで完了し、ステップを呼び出し元に進める。
変数確認/変数書き換え
指定した変数の中身を出力する。これにより、変数にどんな値が入っており、それが正しいか、誤っているかを確認できる。
変数名だけでなく、式 (expression) 形式で出力対象を指定できる機能を持つデバッガもある。
また、デバッグ対象プログラムの一時停止中に変数の中身を任意の値に書き換えた後、再開することができるデバッガもある。

実行手順
デバッグ対象となるプログラムの実行環境により、様々なデバッガの実行手順がある。

 デバッガの子プロセスとして対象プログラムを実行
デバッガを先に起動し、その子プロセスとして対象プログラムを実行する。対象プログラムの実行開始時点からすぐにデバッグができる。
 対象プログラムのプロセスIDを指定し、デバッガを接続
上記とは逆に対象プログラムを先に起動し、デバッガは別プロセスとして起動した上で対象プログラムへ接続する。稼働中のプログラムにて何らかの異常が発生した場合に実施できる。
 対象プログラム自身がデバッガを起動する
上記の変形で、対象プログラムが異常を検出した場合に自分自身でデバッガを起動するもの。例として、UNIXのシグナルハンドラからデバッガを子プロセスとして起動することができる。 
 コアダンプを採取し、デバッガにロードさせる
対象プログラムのメモリイメージやコンテキストなどをコアダンプとして出力させ、デバッガでそれをロードすることにより対象プログラムの状態を再現する。通常コアダンプはプログラムが異常終了した場合に出力されるため、この手順はオフラインでのデバッグとなる。
 リモートデバッグ
OSのカーネルや組み込みシステム、シングルボードコンピュータ向けのプログラムやブートストラップ、ファームウェア等、デバッガを対象プログラムと同じ実行環境にて実行することが困難な場合に、デバッガを別の環境にて実行する手法。対象プログラムとデバッガの接続はシリアルポート、USB、TCP/IP、インサーキット・エミュレータ、JTAG、SWDなど実行環境により多岐にわたる。組み込みシステム向けのCPUでは、リモートデバッグに備えて接続用のピンやインタフェースを用意していることが多い。

デバッガの例
多くのオペレーティングシステムやプログラミング言語処理系にはコマンドラインで扱えるデバッガが付属するほか、ほとんどの統合開発環境にはGUIによって情報の直感的かつ高度な視覚化が可能なビジュアルデバッガが付属している。

 クロスプラットフォーム 
 jdb - Java用のシンプルなコマンドラインデバッガ
 Eclipse内のデバッグ・パースペクティブ - IDEの一部の機能として提供

 ウェブブラウザ 
 Google ChromeのChrome DevTools - ウェブブラウザの一部の機能として提供
 Mozilla FirefoxのJavaScriptデバッガ

 Windows 
 Microsoft Visual Studioのデバッガ（:en:Microsoft Visual Studio Debugger）
 C/C++のネイティブコード、およびC#/VB.NETなどのマネージコードのデバッグに対応するほか、アドインにより追加の言語に対応することも可能。
 ブレーク中にソースコードの一部を書き換えてビルド＆再開することのできる「エディット コンティニュ」(Edit and Continue) をサポートする。
 Visual Basic for Applicationsのデバッガ
 Visual Basicエディターとともに、Microsoft Office内蔵の統合開発環境に付属。

 UNIX 
GDB - GNUデバッガ
LLDB - LLVMのデバッガ
adb - Advanced Debugger の略のようだが（英語版 :en:Advanced Debugger も参照）、。なお一般に absolute debugger という語は symbolic debugger に対比した語で、シンボルを扱えないデバッガという意味で使われる。
dbx - ソース・レベルのシンボリック・デバッガ
TotalView - UNIX/Linux用並列デバッガ：CUDA, Xeon Phi

 Android 
 adb - Android Debug Bridge

 CP/M 
 (CP/M-80付属のデバッガ) 殺虫剤のDDTに掛けている。
SID (シンボル表を読み込み、デバッグ中の表示をシンボル表示にできるようにしたもの)
ZSID (SIDのZ80対応版)

DOS
 - SYMDEBと違い、シンボルを扱う機能がない。
SYMDEB - DEBUGと違い、シンボルを扱えるシンボリック・デバッガとなっている。
 - マイクロソフトの高機能なソース・レベルのシンボリック・デバッガ。MS-C 5.10 等に付属。Windows 用もある。
 - ボーランドの高機能なソース・レベルのシンボリック・デバッガ。Turbo Assembler 5.0J や Turbo C++ 4.0J for DOS 等に付属。Windows 用もある。

 脚注 

*