「デバッグ」の版間の差分
imported>MikeCAT 細 (関連項目を修正) |
imported>MikeCAT 細 (微調整) |
||
32行目: | 32行目: | ||
===[[gdb]]=== | ===[[gdb]]=== | ||
− | [[日本情報オリンピック]] | + | [[日本情報オリンピック]]本選などの統合開発環境が使えない場面でも、gdbというデバッガが使える場合がある。 |
ソースコードをエディタで開き、端末でgdbを実行すれば、統合開発環境のデバッガとほぼ同じ感覚で使える。 | ソースコードをエディタで開き、端末でgdbを実行すれば、統合開発環境のデバッガとほぼ同じ感覚で使える。 | ||
2013年8月22日 (木) 08:15時点における最新版
デバッグとは、バグを探して修正する作業のことである。
目次
主なデバッグ手法[編集 | ソースを編集]
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を入力すればいい。