デバッガ
ソフトウェアを設計・開発する際、プログラム作成開始段階では少なからず誤り(エラーあるいはバグ)が含まれており、設計どおりに動作しなかったり、出力結果が不正確だったりすることが多い。そのため、ソフトウェアのテスト実行をしつつ、正しい動作をするようにプログラムを修正し、不具合の原因となるバグを取り除いていく作業、すなわちデバッグを行なう必要がある。古典的かつ原始的な手法としては、ソースコードを1行ずつ目視で検査(コードレビュー)しながら思考実験により論理的な誤りを見つけ出す方法が挙げられる。また典型的には、標準出力などを利用して実際の変数の状態やプログラム実行順序などを時系列に表示しつつ、プログラム動作および不具合再現手順や発生タイミングを確認する技法が用いられることも多い。C言語のprintf関数にちなんで、この手法を「printfデバッグ」と呼ぶこともある。プログラムのテスト実行によって、ソースコードの流れ、および変数などの中身を確認しながら、その動作の問題点を探ることになる。これにより、変数の取り扱いや計算式、条件分岐などにおける誤りを見つけ出し、修正していく。
しかし、ソフトウェアの規模が大きくなるにつれて、通例バグの数も比例して増え、複雑で大規模なプログラムにおいて不具合の原因がどこに存在するのかを特定することが困難になっていく。標準出力が使えない環境や、ログが瞬時に流れてしまうようなケースではprintfデバッグ技法は適用しにくい。また、本来は必要のないデバッグ用の余分な出力処理を埋め込むことで、ソースコードのメンテナンス性が低下するだけでなく、システムに対する副作用が発生してタイミングがずれるなどして、再現させたいはずの不具合が発生しなくなってしまうこともある。