デバッグ
デバッグとは、バグを探して修正する作業のことである。
目次
主なデバッグ手法
printfデバッグ/putsデバッグ
printf関数を使ってその時点での変数や式の値を出力したり、 puts関数を使ってどこを処理しているか、どこで落ちるかを見つけたりする。 特に後者はfflush関数と併用することが多い。
MessageBoxデバッグ
printfデバッグ/putsデバッグのWindowsのGUIプログラム版。
MessageBox関数を使い、どこを処理しているかや変数・式の値を表示する。 使い方を間違えると、大量のダイアログが表示されてしまい死に至るので注意するべき。
Beepデバッグ
主にWindowsのGUIプログラムで、 MessageBox関数を使うと大量のダイアログが表示されて死に至る場面や処理を停止したくない場面(通信など)で使用する。
Beep関数で音を出す。一度に1~3箇所程度のみ設置し、どこを処理しているかを調べる。 どのBeep関数を通ったかは、数種類なら音の高さや長さで識別できる。
IDEのデバッガ
統合開発環境に搭載されているデバッグ機能を使用する。 通常はデバッグモードでコンパイルしないと利用できない。 デバッグモードでコンパイルしたバイナリは、通常モードに比べてサイズが大きい、単独で実行できないなどの変化が生じる。
デバッグモードでコンパイルし、デバッグ実行すると、 事前にブレークポイントを設置して処理を一時停止させ、そこからステップ実行(1文ずつ実行)させることや、 変数の値をウォッチすることができるようになる。
gdb
日本情報オリンピック本選などの統合開発環境が使えない場面の場合でも、gdbというデバッガが使える場合がある。 ソースコードをエディタで開き、端末でgdbを実行すれば、統合開発環境のデバッガとほぼ同じ感覚で使える。
Macではログインして最初に使用するとき、自分のパスワードを入力する必要があるかもしれない。
準備
コンパイルオプション-g3をつけてソースコードをコンパイルする。この時最適化はしない方がいい。
うっかり癖でstripをかけてしまうとgdbが使えなくなるので、その時はコンパイルしなおすこと。
起動
$ gdb 実行ファイル
でgdbを起動できる。
ブレークポイントの設定
- break 行番号
- 指定行にブレークポイントを設定する
- info breakpoints
- ブレークポイントの一覧を表示する
- delete 一覧のNumで確認できる番号
- 指定したブレークポイントを解除する
プログラムの開始
runコマンドでプログラムを実行できる。 異常終了した場合、その行が表示される。
実行時の操作
ブレークポイントで停止した後、以下の操作(一例)ができる。
- next
- ステップオーバー(次が関数呼び出しの場合、関数の処理を全て実行して次の行に行く)を行う
- step
- ステップイン(次が関数呼び出しの場合、関数内の処理にデバッグが移る)を行う
- continue
- プログラム終了か次のブレークポイントまで実行する
- print 式
- 式の(プログラム内の変数の値を反映した)値を表示する。変数への代入もできる。
終了
quitコマンドで終了できる。「対象を殺しますがいいですか?」みたいなことを聞かれたら、yを入力すればいい。