デバッガ
デバッガ(英: debugger)とは、デバッグ作業を支援するコンピュータプログラムのこと。利用者がデバッグ対象プログラムを対話的に動作/一時停止させたり、プログラムが使っている変数の一覧や内容等を表示させたりする機能がある。近年[いつ?]では統合開発環境に含まれていることが多い。また、インサーキット・エミュレータ (ICE) などでは、ハードウェアと連携して動作する。「デバッガー」と表記することもある。また、デバッグを行なう作業者のことをデバッガあるいはデバッガーと呼ぶこともあるが、プログラムとしてのデバッガは「人間が行うデバッグ作業を支援するプログラム」であり、「自立的にデバッグを行ってくれるプログラム」というわけではない。
インタプリタには内蔵されていることもある。たとえばPerlは起動時に -d
オプションを指定することで、デバッガモードになる。
概要
[編集]デバッガの目的
[編集]ソフトウェアを設計・開発する際、プログラム作成開始段階では少なからず誤り(エラーあるいはバグ)が含まれており、設計どおりに動作しなかったり、出力結果が不正確だったりすることが多い。そのため、ソフトウェアのテスト実行をしつつ、正しい動作をするようにプログラムを修正し、不具合の原因となるバグを取り除いていく作業、すなわちデバッグを行なう必要がある。古典的かつ原始的な手法としては、ソースコードを1行ずつ目視で検査(コードレビュー)しながら思考実験により論理的な誤りを見つけ出す方法が挙げられる。また典型的には、標準出力などを利用して実際の変数の状態やプログラム実行順序などを時系列に表示しつつ、プログラム動作および不具合再現手順や発生タイミングを確認する技法が用いられることも多い。C言語のprintf関数にちなんで、この手法を「printfデバッグ」[1]と呼ぶこともある。プログラムのテスト実行によって、ソースコードの流れ、および変数などの中身を確認しながら、その動作の問題点を探ることになる。これにより、変数の取り扱いや計算式、条件分岐などにおける誤りを見つけ出し、修正していく。
しかし、ソフトウェアの規模が大きくなるにつれて、通例バグの数も比例して増え、複雑で大規模なプログラムにおいて不具合の原因がどこに存在するのかを特定することが困難になっていく。標準出力が使えない環境や、ログが瞬時に流れてしまうようなケースではprintfデバッグ技法は適用しにくい。また、本来は必要のないデバッグ用の余分な出力処理を埋め込むことで、ソースコードのメンテナンス性が低下するだけでなく、システムに対する副作用が発生してタイミングがずれるなどして、再現させたいはずの不具合が発生しなくなってしまうこともある。複雑なデータ構造や膨大なデータ列など、単純にテキストで表現することが難しいケースもある。
そこで、プログラミングツールのひとつであるデバッガを利用して、テスト実行やデバッグの効率化および負担軽減を行なうようになった。デバッガを用いることで、前述の思考実験やprintfデバッグでは難しかった、高度な実行時検証をすることができるようになる。
デバッガの原理は、デバッグ対象のプロセスにアタッチして、プロセスの実行状況に関する情報の双方向通信を行なうことである。オペレーティングシステムにはデバッガの実装に利用可能なAPIが用意されていることもある[2]。コンパイルすると、(人間には理解しにくい)機械語や中間表現になるプログラミング言語であっても、デバッグ用にコンパイル&ビルドする際に、ソースコードに関するメタデータである「プログラムデータベース」(program database; pdb) と呼ばれる追加情報を生成し、デバッグ実行時にこのシンボル情報を参照することで、デバッガは現在実行中のプログラムステップ位置などを特定することができる。
デバッガは性能解析および性能強化にも使われることがあるが、これらは本来プロファイラと呼ばれる別のツールの役割である。デバッグ用にコンパイル&ビルドされたプログラムは、余分なコードや最適化されていないコードを含んでおり、プログラム本来の性能指標としては使うべきではない。また、プログラムにデバッガをアタッチすることでオーバーヘッドを生じることもある。
デバッガの機能
[編集]多くのデバッガは、大体似たような機能を持つ。
- ブレークポイント
- ソースコード中の任意のステップに置くことで、実行の流れを一時的に止める機能。ブレークポイントを置いてからデバッグ対象のソフトウェアを実行した際、デバッガはブレーク位置でプログラムの処理を一時停止させる。これにより、任意の位置での実行状況(変数の値やメモリの内容)を調べることができるようになる。一時停止後に通常通り実行を再開することもできる。
- ステップ実行
- 処理を止めた後で、1ステップずつ対話的にソースコードを実行する。これにより、ソースコードをステップごとに追いかけながら実行することができ、状態の変化の確認やロジックの問題点を探ることができる。
- 変数確認/変数書き換え
- 指定した変数の中身を出力する。これにより、変数にどんな値が入っており、それが正しいか、誤っているかを確認できる。
- 変数名だけでなく、式 (expression) 形式で出力対象を指定できる機能を持つデバッガもある。
- また、デバッグ対象プログラムの一時停止中に変数の中身を任意の値に書き換えた後、再開することができるデバッガもある。
デバッガの例
[編集]多くのオペレーティングシステムやプログラミング言語処理系にはコマンドラインで扱えるデバッガが付属するほか、ほとんどの統合開発環境にはGUIによって情報の直感的かつ高度な視覚化が可能なビジュアルデバッガが付属している。
クロスプラットフォーム
[編集]ウェブブラウザ
[編集]- Google ChromeのChrome DevTools - ウェブブラウザの一部の機能として提供
- Mozilla FirefoxのJavaScriptデバッガ
- C/C++のネイティブコード、およびC#/VB.NETなどのマネージコードのデバッグに対応するほか、アドインにより追加の言語に対応することも可能。
- ブレーク中にソースコードの一部を書き換えてビルド&再開することのできる「エディット コンティニュ」(Edit and Continue) をサポートする。
- Visual Basicエディターとともに、Microsoft Office内蔵の統合開発環境に付属。
UNIX
[編集]- GDB - GNUデバッガ
- adb - Advanced Debugger の略のようだが(英語版 en:Advanced Debugger も参照)、SysV 系のマニュアルなどで absolute debugger と書かれていることがあるようである[要出典]。なお一般に absolute debugger という語は symbolic debugger に対比した語で、シンボルを扱えないデバッガという意味で使われる。
- dbx - ソース・レベルのシンボリック・デバッガ
- TotalView - UNIX/Linux用並列デバッガ:CUDA, Xeon Phi
Android
[編集]- adb - Android Debug Bridge
- DDT (CP/M-80付属のデバッガ)
- SID (シンボル表を読み込み、デバッグ中の表示をシンボル表示にできるようにしたもの)
- ZSID (SIDのZ80対応版)
- DEBUG - SYMDEBと違い、シンボルを扱う機能がない。
- SYMDEB - DEBUGと違い、シンボルを扱えるシンボリック・デバッガとなっている。
- CodeView - マイクロソフト社の高機能なソース・レベルのシンボリック・デバッガ。MS-C 5.10 等に付属。Windows 用もある。
- Borland Turbo Debugger - ボーランド社の高機能なソース・レベルのシンボリック・デバッガ。Turbo Assembler 5.0J や Turbo C++ 4.0J for DOS 等に付属。Windows 用もある。
脚注
[編集]- ^ “もう一度基礎からC言語 第13回 エラーメッセージと対処方法(3)~開発手順の効率化 printfデバッグを試す”. dev.grapecity.co.jp. 2020年7月17日閲覧。
- ^ “プロセスデバッガを作ってみる”. CodeZine. 2020年7月17日閲覧。