2.3 バグとの闘い方 永遠の宿敵 バグとの永遠の闘い バグを修正する作業をデバッグという ►「デバッグ実行」ってコレのことだったのね バグをこの世から無くすことは不可能 ►だから見つけ次第修正して潰していくしかない やるからには効率的にやりたいよね 2.3 バグとの闘い方 2 デバッグの手順 発見 原因特定 修正 確認 2.3 バグとの闘い方 3 発見 偶然見つけたときはラッキー ►それだけでは不十分 積極的に見つけるには? ►関数にわざと意地悪な値を渡す ►わざとエラーになりそうな状況で何度も試す 2.3 バグとの闘い方 4 発見のコツ 意地悪な値の例 ►ゼロ ►負の値 ►内部的に tan(PI/2) になったりするような値 エラーになりそうな状況の例 ►わざとタイムオーバー、フライング ►わざと壁にめり込もうとする ►その他に内部的に意地悪な値が出そうな状況 この辺を意識して変な動作を見つける 2.3 バグとの闘い方 5 原因特定 ただ闇雲に探してもダメ ►数千行ものコードからミスを発見するのは困難 ►バグを以下の3種類に分類して説明する 1. 無条件に必ず再現するバグ ►どんな状況でも必ず最初から変な動作をする 2. ある条件で必ず再現するバグ ►同じ状況では必ず同じ変な動作をする 3. 再現しないバグ ►同じ状況でも動作が様々で、正常なことすらある 2.3 バグとの闘い方 6 1.無条件に必ず再現するバグ 症状 ►初めからキャラが表示されない ►画面が真っ黒で進まない など 原因 ►外部ファイルが読めない 画像ファイルのパスが違うとか 自作のマップデータにミスがあるとか ►計算式が間違っている よく見るとゼロをかけてるとか(三角関数など) よく見るとゼロで割ってるとか 2.3 バグとの闘い方 7 2.ある条件で必ず再現するバグ 症状 ►キャラが壁に接触するとどっかに行く ►2回目以降のプレイは即死 など 原因 ►一般的なミス 計算順序が不適切とか 変数の初期化ミスとか 2.3 バグとの闘い方 8 3.再現しないバグ 症状 ►アイテムを取り過ぎるとマップが書き換わる ►いきなりエラーで動作が止まる など 原因 ►メモリ関係 配列の範囲外を読み書きしてるとか 指す先がテキトーなポインタを読み書きしてるとか ►乱数関係の計算ミス 単に計算式が間違っているとか 2.3 バグとの闘い方 9 修正 テキトーにやらないこと ►とりあえず消したり戻したり ►とりあえず行をコピペで入れ替えたり ►とりあえず1足したり引いたり こういうことはしちゃダメ! テキトーにやると泥沼化する ►ちゃんと考えてやること 間違って正しいコードを消さないようにする ►いきなり消すのではなくコメントアウトする 2.3 バグとの闘い方 10 確認 修正したら必ず確認 ►修正して直ったかどうか確認 ►修正したことで新たなバグが生まれたかもしれない つまり最初の「発見」に戻るということ ►バグが現れたらデバッグの手順を繰り返す ►なんだか while 文みたいだね 2.3 バグとの闘い方 11 出力関数を用いた原因特定(1) printf や printfDx を活用する ►printf はお馴染みのアレ ►printfDx はDXライブラリ用 ►clsDx でクリアする必要がある 変数の内容を調べる ... for (int i = 0; i < 10; i++) { printf("x = %f\n", x); x = (pow(x, 2) + d) / (2 * x); } ... 2.3 バグとの闘い方 12 出力関数を用いた原因特定(2) 強制終了の原因箇所を調べる ►どこまで出力されたかによって原因箇所が分かる ... a statement1() が原因 printf("a\n"); statement1(); printf("b\n"); statement2(); a b c statement2() より後が原因 (何も表示されない) printf("c\n"); statement1() より前が原因 ... 2.3 バグとの闘い方 13 出力関数を用いた原因特定(3) どの分岐を通ったか調べる ... if (/* 条件1 */) { printf("a\n"); statement1(); } else if (/* 条件2 */) { printf("b\n"); statement2(); } else { printf("c\n"); statement3(); } ... ゲームを作っている時は 黒いコンソールの画面が出てこない? → 補足事項で方法を解説するよ 2.3 バグとの闘い方 14 補足事項 もっと詳しくデバッグ手法 コンソールの内容を見る方法 ►Wikiを見てね http://nanzanmmc.net/pc/lecture/game/add 2.3 バグとの闘い方 15
© Copyright 2024 ExpyDoc