このサイトは更新終了し, こちらに移行しています。

C言語入門: デバグのやりかた

筑波大学農林工学系 奈佐原(西田)顕郎

ホーム


バグとは

ちょっとしたプログラムでも, 組んですぐに完璧に動くのは稀である。われわれは間違いをおかす動物であり, また, C言語は特に間違いに対して容赦ない言語なので, 我々が組むC言語プログラムは, たいてい, 間違いのためにうまくコンパイルできなかったり, たとえコンパイルはできても, 望んだようには動かなかったりするものである。そのような間違いのことを, コンピュータの業界ではバグ(bug)と呼ぶ。「バグ」という語の原義は「虫」である。機械の中に, 我々の邪魔をする害虫がひそんでいる, というイメージである(その虫を作り出したのは我々自身なのだが)。そしてその虫を退治すること, つまりプログラムの中の間違いを修正する作業のことを, コンピュータの業界ではデバグ(debug)と呼ぶ。

バグの原因は様々だが, おおまかに言って以下のようなものがある:

英語が不得意な人(特にスペリングが怪しい人)は, この手のバグをよく作る。悔しいがコンピュータの言語のほとんどは英語をベースにしている。英語の基礎学力はこういうところにも効いてくるのだ。 このあたりは, 単に文法に関する間違いなので, コンパイルのときにエラーメッセージで指摘されるから, 直すのも簡単である。しかし, 文法が正しくても, などに起因するバグもある。これらは, コンパイルの時点で見つからないことが多く, 実際に実行してはじめて, "segmentation fault error"というエラーメッセージを受けたり, あるいは間違った結果や, いつまでたっても終わらぬ処理(無限ループという)になってはじめてバグに気づく。


デバグのテクニック

エラーメッセージをよく読み, 理解する。

エラーメッセージには, エラー(バグ)に関する情報が詰まっている。エラーメッセージをよく読み, その意味を理解し, 何が原因なのかをよく考えることが重要である。

viの行番号指定を活用する。

エラーメッセージには, エラーが発生位置の行番号が表示されることが多い。ソースコードのその部分を修正するには, viのコマンドモードで,

:5
のようにコロンに続けて行番号(この例では5行め)を入れてENTERを押せば, その行へすぐにジャンプできる。

manを活用する。

C言語の関数の使いかたは, 以下のように, UNIXのコマンドと同様に, manコマンドで調べることができる。

$ man scanf

怪しい部分の前でexitするか, 怪しい部分をコメントアウトして, 怪しい箇所を絞り込む。

segmentation faultなどのエラーは問題箇所がすぐにはわからない。このような場合, あやしい箇所の前にexit(0);という関数を入れて実行してみよう。この関数は, その箇所でプログラムを強制的に終了する。したがって, exit(0);を入れたらエラーが出ずに終了する, という場合は, 問題箇所はexit(0);よりもあとの行に存在することになる。これを利用して, すこしづつexit(0);をうしろにずらしながら試してみよう。あるときエラーが再発するだろう。その部分に問題箇所が潜んでいる可能性が高い。

また, あやしい箇所を, //などでコメントアウトするのも有用である。コメントアウトすることによってエラーが出なくなったら, その箇所がやはりあやしい。

変数の値を表示してみる。

エラーは出ないのだが結果はおかしい, というような場合は, 内部の処理が思うように行っていない。その場合は, いくつかの変数に着目して, その変数の内容を, 処理の途中で, printfなどで画面に表示してチェックしてみよう。

入力データや設定を単純化して、原因を切り分ける。

結果が望んだようにならない場合は、できる限り単純な入力・単純な設定にして試験するとよい。単純な入力・単純な設定なら、どういう結果になるべきかが容易にわかるため、不具合の発生原因を推測しやすい。

エラーメッセージをネットで検索する。

見慣れないエラーメッセージが出てきて, しかもその意味がわからなければ, そのメッセージをGoogleなどに放りこんで検索をかけてみよう。どのような場合にそのようなエラーが出るのかという情報が得られるかもしれないし, 君と全く同じバグに遭遇して解決した人の経験が出ているかもしれない。

「良いソースコード」を書く。

ソースコードは, レポートや作文と同様に, 「知的作品」であり, 書き方に巧拙が存在する。うまく書かれたソースコードは読みやすく, 下手なソースコードは読みにくい。読みやすいソースコードは, シンプルで明瞭でわかりやすいので, バグが発生しにくいし, デバッグもやりやすい。

たとえ自分ひとりが使うプログラムでも, 客観的に他人の目でみたときにわかりやすくなっているかどうかを意識して書くことが, 良いソースコードをかくための第一歩である。それに, 君自身がどうしてもデバグできないときに, 友人や先生に助けを求める場合, 君のソースコードが汚ければ, あまり助けてもらえないかもしれない。

良いソースコードを書くためのポイントは, 以下のとおりである:

実は, 良いソースコードを書く技術は, 良い論文や良いレポートを書く技術や, 良いプレゼンテーションをする技術と, かなりの部分, 共通するところがある。自分が表現したいことを深く考えて把握し, 思い切ってシンプルにする, という頭の働きが, いちばん大事なのである。


学生さんがよくやらかす, バク以前のミス

以下のような単純ミスは、バグではない。なので、いくらソースコードを眺めて悩んでも解決できないため、かえって学生さんを苦しめることが多い。
(ブラウザの「戻る」ボタンで戻ってください)