みなさんはデバッガというソフトウェアをご存じでしょうか。デバッガはプログラムのバグを発見、修正してくれるもの…というわけではありません。そんなものがあればわたしが欲しいです。
デバッガはプログラムがバグを発見しやすくするための補助ツールです。あくまでバグを見つけたり修正したりする主体はみなさん自身であってデバッガではありません。
デバッガには主に2つの用途があります。
以下それぞれについて説明します。
デバッガはデバッグ対象のプログラムの実行ファイルを変更することなく、次のようなことができます。
これらをまとめると以下の図のようになります。

プログラムにバグがあるとわかったときに、次のような、いわゆるprintfデバッグをしているかたは多いかと思います。
この方法には、一つの試行のためにいちいちプログラムを変更しなくてはならないという問題があります。ビルドに時間がかかるというコストもあります。
このようなときにデバッガを使えば、あたりを付けた場所でプログラムの実行を止めて、そのあと一行一行実行するといったことができるので便利です。
その一方でprintfのほうが好ましいこともあります。
デバッガはデバッグ以外の用途にも使えます。プログラムを実際に動かしながら内部情報を確かめられるため、プログラムの理解を深めるためにソースコード読解と併用すると大変便利です。
プロセスが異常終了したときに、終了時のメモリダンプをファイルに書き出せます。このメモリダンプをデバッガに与えると、プロセスが異常終了したときの状態を見られます。異常終了したときのバックトレースや、そのときの変数の値はデバッグの大いなる助けになります。
とくにプログラムが異常終了した際に原因調査と再発防止策を厳しく求められるエンタープライズシステムにおいてデバッグとコアダンプを使った問題の解析は便利です。筆者もかつてサポート技術者をしていたことは毎日たくさんのコアダンプ[1]を見ていました。
実行中のプログラムのコアダンプだけ採取して実行を継続させるgcoreというプログラムもあります。
筆者がデバッガを使うのは主に次の用途です。
この二つの用途ではデバッガは素晴らしく役に立っています。その一方で、既存バグのデバッグのためにデバッガを介してプログラムを動かすということは滅多にやりません。
これは筆者が主に触っているプログラムが前述の「printfのほうが好ましい」に該当するからです。デバッガは使えるなら必ず使えばいいというわけではなく、適材適所で使うものです。
デバッガは最初に使うまでに心理的抵抗があるのですが、それほど使い方が難しいわけではありません。使ったことがないかたは一度試してみてはいかがでしょうか。CやC++プログラムならgdb、Goプログラムならdelveなどが一般的に使われています。
正確には筆者が見ていたのはプロセスのコアダンプではなくシステム全体のメモリのダンプ、カーネルダンプでした↩︎
Rook(メンテナ)/Ceph/K8s/TopoLVM(メンテナ)書籍amazon.co.jp/dp/477419607Xyoutubeyoutube.com/channel/UCgrUyRFiHhV607Orhriau6w
バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。

Rook(メンテナ)/Ceph/K8s/TopoLVM(メンテナ)書籍amazon.co.jp/dp/477419607Xyoutubeyoutube.com/channel/UCgrUyRFiHhV607Orhriau6w