[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

デバッグの仕方

HSP(プログラミング)初心者・初級者を対象にデバッグの仕方をアドバイスしていくページです。
初級者にはこれを読む前にある程度、簡単なデバッグの仕方を覚えておいて欲しいものですが、作っているプログラムは高度なのに「デバッグの仕方が分かりませ〜ん;;」じゃ話にならないので、ここを読んで是非「デバッグとは」を覚えましょう。

目次


バグとは

自分の意図したとおりにプログラムが動かない状態のことなどをバグと言います。

デバッグとは

バグの原因を調べ、問題を解決する一連の作業をデバッグと言います。
一般的にプログラムが意図したとおりに動かない原因には「内的要因」と「外的要因」があります。
「内的要因」はズバリ、コードの記述ミスです。誤字や、処理手順のミスなどです。
「外的要因」はコンピュータが壊れているだとか、メモリが足りない、ライブラリの不具合、HSPの不具合などです。

ここでは「内的要因」、つまり自分のミスをいかに防ぐか、いかにミスを発見するかに焦点を当てます。

デバッグの心得

デバッグに取り掛かる前に次の項目を声に出して読み上げましょう。

  • プログラミングの法則『プログラミング=コーディング+デバッグ』を丸暗記!
  • HSPを疑う前に自分を疑え!
  • 書いている本人がデバッグしなければバグはなくならない!
  • 書いている本人がデバッグしなければいつまで経ってもバグの対処の仕方を覚えない!
  • バグ・エラーの原因は発生場所にあるとは限らない!
  • プログラミング作業時間全体の半分以上はデバッグ!
  • 悩んで悩んで悩みぬいてそれでもダメなときもある!そんなときは「あえて……寝るっ!!」

捕捉

  • バグ潰しはとても時間のかかる作業です。何時間調べてもバグの個所・原因が分からない時は、他の作業を進めましょう。
  • 疲れているほど頭が働かず、頑張るほど問題が解決しないときがあります。そういうときはプログラミングをお休みしましょう。そして次の日スッキリした頭で再びデバッグに取り掛かれば、前の日は気づかなかった点に気がつくでしょう。

デバッグの第一歩

ここで取り上げる内容は最低限の行動です。マニュアルを読んでいなかった、名前が正しいか確認していなかった、デバッグウィンドウを見ていなかった、ということの無いように必ずチェックしましょう。

マニュアルを読む

  • 演算子の優先順位を確認する(hspprog.htm)
  • 文字列の扱われ方を理解する(hsp3str.htm)
  • エラー内容(hspprog.htm)
  • 命令の機能を理解する。(indexf.htm)サンプルが書かれていなければ実際に試行錯誤して自分でサンプルを提供するくらいの気持ちで。

誤字・脱字を疑う

  • 名前(変数名・命令名・関数名・マクロ名、その他"○○名"と呼ばれるあらゆる名前)が間違っていないか
  • 「i(小文字のアイ)」と「l(小文字のエル)」を間違っていないか
  • 「0(数字のゼロ)」と「O(大文字のオー)」を間違っていないか

デバッグウィンドウを見る

  • 変数名のチェック
  • 変数の型チェック
  • 変数の値チェック

デバッグの手順

  1. バグ・エラーが発生する状況をよく確認する。
    いつでもバグ・エラーを再現できるように、問題が発生する操作や状況をよく確認します。(たまに起きるような場合は○回に1度などはっきりと分かればいいが、できれば再現性がほしい。)
  2. バグ・エラーの種類を特定する。
  3. 特定したバグ・エラーがどこから起きているのか(エラー原因が作られているのかなど)を絞り込む。
  4. バグの範囲が特定できたらバグの種類に応じて適切な対処を施す。

いろいろな絞込み法

mesデバッグ

  • コードのいたるところに「mes」命令をばらまいてプログラムの処理の流れや、変数の値の変化を画面に表示して確認する方法。

titleデバッグ

  • 画面に表示する代わりにタイトルに表示させて確認する方法。

dialogデバッグ

  • ダイアログを表示してプログラムの処理を一時停止させて確認する方法。
    ひとつひとつ、確実に確認するときに向いている。

stop デバッグ

  • dialog デバッグと似たような使い方ですがそこでプログラムの処理を止めるので特定の箇所のみ集中してデバッグする際に向いている。
    一時的に止めて再開させたい場合などはassertデバッグのほうが柔軟です。

end デバッグ

  • stop デバッグを「end」に変えて終了させてしまうもの。特定の処理によっては終了時に強制終了する場合があったりするため。<-(これはデバッグかな? 汗;)

bsaveデバッグ

  • mesデバッグは注意しないと画面の外に書き込んでしまい、表示したものが見れない場合があります。
    大量にmesをばらまくときは画面ではなくファイルに書き出して、あとでゆっくり出力されたデータを確認するというbsaveデバッグが有利です。

logmesデバッグ

  • logmesで出力した文字列は標準デバッグウィンドウなら[ログ]タブを選択することで確認することが出来ます。

assertデバッグ

  • assert命令を使うと処理を一時停止したあとに処理の再開が可能です。
    処理の再開、一行ごとに実行するときはデバッグウィンドウの「実行」「次」「停止」ボタンでコントロールすることができます。
    stopデバッグより柔軟な方法です。

ラッピング

  • デバッグモードフラグのON/OFFによって既存の命令にデバッグコードをランピングしたりすることで、ソースの大幅な変更を留めることができたりする。(Note:デバッグの仕方)

デバッグウィンドウで情報を見る

  • title デバッグやstop デバッグは停止するのでその間にデバッグウィンドウで変数やネストなどの情報を見ましょう。変数の値がおかしかったり変な変数が表示されていたりネストがおかしかったりしたらそれを集中的に監視しましょう。

コード削減デバッグ

  • 問題が発生するプログラムの全体のコード量が多い場合は、コード量を減らしてデバッグしましょう。
    「全体のコード量が少ない=チェックするべきコードが少ない」ということです。

HSPのデバッグ用の命令