「実践デバッグ技法 Norman Matloff、Peter Salzman 著、相川愛三訳 オライリージャパン」で gdb の実用的 ( 効率的 ) な使い方が紹介されていました。私の環境は、Windows11 に wsl を使って Ubuntu をインストールしています。テキストエディタは vim を使っています。
通常のデバッグの手順
通常は、次のような手順でソースコード ( ins.c ) をデバッグしていきます。insert_sort はコマンドライン引数で与えられた数値を昇順に並べ替えるプログラムです。
① ソースファイルを作成
$ vim ins.c
② ソースファイルを -g を付けてコンパイル
$ gcc -g -o insert_sort ins.c
③ 12, 5 を引数に与えて実行してみる
$ insert_sort 12 5
④ エラー発生
⑤ gdb を起動
$ gdb insert_sort
(gdb) run 12 5
⑥ デバッグ作業でバグを推定して gdb 終了
(gdb) quit
⑦ ソースファイルを修正
$ vim ins.c
⑧ 再コンパイル
$ gcc -g -o insert_sort ins.c
⑨ 以下を実行して、動作 OK
insert_sort 12 5
5
12
もし ⑨ でエラーが発生すれば、⑤ からやり直します。
gdb はコマンドライン引数やブレークポイントを保持していますが、gdb を quit で終了するとそれらが失われます。デバッグで同じブレークポイントを設定したい場合は、毎回設定し直さなればなりません。gdb や vim は開きっぱなしで作業したほうが効率的です。
シェルのジョブ管理
Linux のシェルにはジョブ管理機能があり、エディタやデバッガなどのジョブを切り替えて使うことができます。前項のデバッグ手順に、この機能を利用すると以下のようになります。
fg ジョブid は、フォアグラウンドでジョブを実行するコマンドです。
参照: ジョブを管理するコマンド
① ソースファイルを作成後、Ctrl - z で vim を中断
$ vim ins.c
[1]+ Stopped vim ins.c
② ソースファイルを -g を付けてコンパイル
$ gcc -g -o insert_sort ins.c
③ 12, 5 を引数に与えて実行してみる
$ insert_sort 12 5
④ エラー発生
⑤ gdb を起動
$ gdb insert_sort
(gdb) run 12 5
⑥ デバッグ作業でバグを推定して Ctrl - z で gdb を中断
(gdb)
[2]+ Stopped gdb insert_sort
⑦ vim を再開して、ソースファイルを修正後、Ctrl - z で中断
$ fg 1
vim ins.c
[1]+ Stopped vim ins.c
⑧ 再コンパイル
$ gcc -g -o insert_sort ins.c
⑨ 以下を実行してみる
insert_sort 12 5
⑩ エラー発生
⑪ gdb を再開
$ fg 2
gdb insert_sort
run ( 以前の引数を利用するときは、引数を省略可能 )
...
`/home/ ~ /insert_sort' has changed; re-reading symbols.
...
`/home/ ~ /insert_sort' has changed; re-reading symbols.
は、プログラムが再コンパイルされたことを gdb が見つけ、プログラムを実行する前に、新しいバイナリ ( 実行コード ) とシンボルテーブルを自動的に読み込み直したことを示しています。
⑫ デバッグ作業でバグを推定して Ctrl - z で gdb を中断
(gdb)
[2]+ Stopped gdb insert_sort
⑬ vim を再開して、ソースファイルを修正後、Ctrl - z で中断
$ fg 1
vim ins.c
[1]+ Stopped vim ins.c
⑭ 再コンパイル・実行
$ gcc -g -o insert_sort ins.c
$ insert_sort 12 5
5
12
もし ⑭ でエラーが発生すれば ⑪ からやり直します。
マルチウィンドウが使える場合
テキストエディタと、gdb を別々のウィンドウで起動しておき、第 3 のウィンドウで、プログラムのコンパイル、実行をおこなうようにします。
Termdebug の利用
VimからGDBを起動する方法 で紹介されていた、vim のプラグインで利用できる Termdebug もいいですね。
下記はデモ画面です。ソースファイルは until-anomaly.c、バイナリファイルは until-anomaly。「Hello world」 を 5 回印字するプログラムです。
左上はデバッガ ( gdb )、左下はプログラムの出力、右半分はエディタ ( vim ) の画面です。ブレークポイントや、プログラムの停止位置をソースコード上で確認できます。各領域を区切るバーをマウスでドラッグすると、領域のサイズを調整できます。
画面全体が崩れたときは、ウィンドウの全体のサイズをマウスで少し変更すると自動で戻るようです。