[1996/01/30] プログラムデバッグ心得 (debug rule) ------------------------------------------------------ 0. 揺さぶりをかける ------------------------------------------------------ a. 考える -- 何をしたいのかを考える(目的) -- 何をすればいいのかを考える(方法) -- どうなればいいのかを考える(目標) b. 気力を保つ c. 休憩する d. うっかりミスを防ぐ e. プログラムリストを印刷してみる ------------------------------------------------------ 1.1 問題を簡単にする.整理し分割する -- 必要のない変数を削除する -- 長い関数を切り分ける 切り分けられない場合は問題が整理されてない -- 関数への引数を最小限にする 長くなる場合は問題が整理されてないかも -- 似た用途の変数が多数存在する 構造体でまとめる -- マイナーチェンジの部分が多数存在する 単一の機能を持つ関数を利用する? -- 変更点を一つにまとめる ヘッダファイルの使用 定数・ マクロの定義 (マジックナンバーを使わない) -- でも問題を簡単にするのも難しいのだ! --> どうしても複数の事をまとめてやってしまおうとしてしまうなぁ (特に時間のないときは...(--")) --> 問題を各要素に分離できる能力が必要なのか? -- c.f. 初心者のプログラムの関数はめちゃめちゃ長くなる. 1.2 段階的に処理する 1.3 部分的に確実にする.動作確認を行う. ------------------------------------------------------ 3. 装置のケーブル接続確認 -- つながってるか? -- スイッチは入ってるか? -- 壊れてないか? ------------------------------------------------------ 4. 変数の初期化の確認(超基本!!) -- 初期化がちゃんとしてなかったら,まともに動く筈がない -- 繰り返し処理や総和を求めるとき -- 変数の型のチェック -- 配列のサイズや領域確保・開放 -- 何がなんでも初期化を行う(<-- 処理時間との相反関係) -- 元データのチェック 処理結果がおかしいのではなく元データの段階で 壊れているのではないか? 5. 境界値(0 とか最大値とか)での処理結果の確認 -- 結果の予測の容易な値を使ってみる -- 1増やす -- 1減らす -- 倍にする -- 半分にする 6. 値を変えてみる 効果がなかったら異常 7. バグを故意に起こしてみる そのバグが起こらなかったら異常 8. 処理をやめてみる その処理の効果が残っていたら異常 9. 処理順序を変えてみる 順序に関係ないはずなのに結果が変わったら異常 10. 処理量を減らしてみる 簡単に把握できる量でデバックする ゆっくり処理してみる ------------------------------------------------------ 96. 別の言語を使ってみる 97. 別のコンパイラを使ってみる 98. コンパイルしなおしてみる 99. イチから作り直してみる 参考文献: 「プログラム書法」 「プログラム作法」 「プログラミングのエッセンス」 追記:[1996/02/06] [1997/12/28] |