2.3 バグとの闘い方

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