Cygwinでデバッグ

エラーの出る場合

エラーは、大きく分けて3通りあります。コンパイル時のエラーと、リンク時のエラーと、実行時のエラーです。

  1. コンパイル時のエラーは、原因の特定に役立つことが多いです。
  2. リンク時のエラーは、メッセージが不親切ですが、原因の特定は簡単です。
  3. 実行時のエラーは厄介で、どこでエラーが起こったのかわかりにくく、苦労することが多いです。

エラーメッセージを、そのまま Google などの検索エンジンに放り込んでみる、という手法も効果的です。見たことのないエラーメッセージに対しては、ぜひ試してみるべきでしょう。

コンパイル時のエラー

コンパイル時のエラーは、言語の文法上の間違いによって起こります。エラーメッセージは、多くの場合は原因の特定に役立ちますので、しっかりと読んでみましょう。分からない単語は辞書で引いてみるのもよいでしょう。 'parse', 'array', 'argument', 'redeclaration' などの単語は、日常英会話では使いませんが、プログラマとしてはぜひとも知っておくべきです。

また、エラーメッセージは最初のものから対処することが重要です。なぜなら、最初のエラーに対処すれば、その後のエラーが直ってしまうことも多々あるからです。このようなことは、カッコの抜けによるエラーでよく起こります。次はエラーの例です。

リンク時のエラー

gcc コマンドを実行した時に出るエラーという意味では、コンパイル時のエラーと同じですが、文法上のエラーではないので、メッセージががらっと変わって「何行目に間違いがあるか」がわからなくなってしまいます。

実行時のエラー

実行時にいくらエラーメッセージが表示されても、残念ながら手がかりになる情報はほとんど読み取ることができません。原因としては、配列の添え字あふれや、0 での割り算のようなものが考えられますが、ソースコード上の場所がわからないので、どこを疑ってよいのか見当がつきません。

実行された様子を確認するために、printf() で変数を表示をさせてみるのも1つの方法です。→Cygwinでデバッグ/不可解な動作

ここでは、デバッガというツールを用いて、エラーの出ている場所の特定を行ってみます。まず、コンパイルの時に、オプションを余分につけておきます。

gcc -Wall -g hoge.c

この時点で警告が出た場合は→Cygwinでデバッグ/不可解な動作へ。

オプション -g が重要です。デバッグ情報を埋め込みます。動作には影響ありませんので、常につけておいても害はありません。

最適化オプション -O ははずしておく(あるいは -O0(オーゼロ) を指定する)のが無難なようです。

次に、デバッガの中でプログラムを実行してみます。

gdb a.exe

デバッガの中ではプロンプトが変化して

(gdb)

のようになります。「ここで入力できるのは gdb のコマンドですよ」という目印です。 エラーで止まってしまうプログラムを解析するのであれば、だいたい次のようなコマンドを順に入力します。

run          プログラムを実行(エラーで止まるはず)
where        現在実行中の場所を表示
list         ソースコード表示
print i      変数 i の値を表示
quit         終了

他にも、多くの機能があります。ブレークポイントというのは、そこを実行した時に、一時中断する場所のことです。あやしそうな処理の直前にしかけておいて、変数の値を確かめながらゆっくりステップ実行するのに使います。

             ブレークポイントを登録
break 行番号
break 関数名
break ファイル名:行番号

step         ステップ実行(呼び出した関数の中も追いかける)
next         ステップ実行(呼び出した関数の中は追いかけない)
finish       現在の関数の最後まで実行
continue     実行の継続
backtrace    関数の呼び出し関係を表示
display i    変数 i を常に表示
help         ヘルプメッセージを表示

ただ単に Enter を入力すると、直前のコマンドが繰り返して実行されます。またコマンドは先頭1〜2文字の省略形でも入力できます。高度な利用法は他の文献を参照してもらうことにして、エラーで止まる場所が特定できるだけでも役立つと思うので、活用してみて下さい。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-11-01 (土) 18:58:24