「今すぐ」デバッグ効率を上げる5つの習慣

メルマガバックナンバー 第15回

こんにちは、プログラミング書籍の館の江畑です。

前回から失踪を心配するレベルに間が空いちゃいました…
断じて、けもフレ2にショックを受けたわけではなく、アプリのバージョンアップをしてました。

Androidが意味不明な動作をし、Appleは無慈悲に互換性を切り捨てやがる。
Titaniumというマイナーな開発環境なので、ググってもなかなか解決策が得られずシャウトしてました。

でも今回勉強になったのは

バグ究明や技術調査を探偵気分で楽しめると強い!

って事です。

毎回は無理でも、時々そういう態度でコードに向かうよう心掛けたいと思いました。

デバッグ効率を上げる5つの習慣

という体験をしたので?今回のテーマはデバッグです。

今すぐ簡単に試せて、バグの解決に役立つコツを5つ紹介します。
簡単な習慣だよワトソン君。

1、まず観察する

バグに遭遇した時、よく分からないまま勘で修正してはいけません!

まず何が起こってるのか? を知るのが大切です。
名探偵に習って事件の情報を集めましょう。

具体的には print文 を挿入します。目的は次の2つだけです。
・変数の中身を出力してみる
・どこまで呼ばれたかを確認する

print文 を挿入する箇所は、この2点を基準に決めて下さい。

また、デバッガ(ブレークポイント)を使うのも有効です。

ただ私の経験上、デバッガは少し原因の予測が付いた時に使うのをお勧めします。
究明が進んでない段階でデバッガに頼っても、あまり役立った記憶がありません。

デバッガは便利ですが、情報を全体的に見たりパターンを探すのは苦手です。
大まかな原因究明は print文 や ロギング が有効だと思います。

2、一箇所ずつ直す

バグを修正する時に気を付けて欲しいのは複数箇所を同時に直さないことです。

例えばセーブが上手く行かない時
「セーブデータの生成処理」と「ファイル命令の呼び方」を一気に直して実行する
これは止めた方が良いです。

なぜなら結果が変化してもどちらが原因か?が分からないからです。
ちなみに私は今月コレをやってしまい、時間を浪費しました。

いくら両方怪しくても、まず片方だけ直して観察しましょう。
そして予想通り失敗したなら、もう一方を修正すれば良いのです。

人間の思い込みは恐ろしいもので実は原因は全く違う所にあるケースも多々あります。
よっぽどの確信が無い限り、同時に複数箇所を直すのは避けるべきです。

名探偵は短絡的にならず、コツコツと真相に迫るわけですね。

3、わざと失敗してみる

バグを発見したら、今度はそのバグを100%起こしてみましょう。
つまり、どんな手順や条件で発生するのか? を確定させます。

操作方法を色々試すのが基本ですが、その時の状況(時間・回数・負荷・ハードなど)を記録するのも大事です。

また操作が面倒なら、最初から典型的なデータを変数にぶち込んでメソッドを呼んでやりましょう。
怪しい値を変数の初期値にして実行するわけです。

私の経験ですが、あるパターンのセーブデータをバイナリエディタで作って、ロードのバグを突き止めた事もあります。

こうやって事件を確実に起こせたなら、解決したも同然です(ちょっと言い過ぎか)。

4、最後に動いていた時から何をしたか? を思い出す

何もしてないのに動かなくなった!
こんな経験ありませんか?
そんな時はその間に何があったかを考えてみましょう。

実はほんの些細な変更をしていて、すっかり忘れていた可能性もあります。

ちなみに私は先週これをやりました。
1日の最後に不要な部分を消したつもりが、閉じカッコも抹殺してしまい翌日いきなりコンパイルエラー100個出しました。

また意外な所では次のようなのもあります。

・OSやツールのバージョンアップ
→特に自動のやつは怖い!

・ハードを変えた
→あるコントローラで発生した学生がいました

・別のソフトをインストールした
↓むかしAppleのQuickTimeは、環境変数をぶっ壊しコンパイル不能にしてくれました
https://torutk.hatenablog.jp/entry/20051030/p1

関係ないと思ってたら実は関係あった…なんてケース枚挙にいとまがないです。

名探偵は思い込みを排除して推理し、意外な真相を気付かせてくれます。

5、エラーメッセージでググる

上の4つと違って、実に即物的な方法です。
エラーメッセージの意味が分からなかったら、それでググりましょう。

運が良ければ、同じ問題でハマっていた人のブログや掲示板が見付かります。

特に英語のエラーメッセージで有効な戦術です。

私も先週「iTunes Store」にアプリをアップロードしようとしたら、英語で脅しみたいな警告を喰らいました。
呼んでもイミフだったので、警告内容でググったら情報が大量に見付かり、5分で解決しました。

どんなマイナーなエラーでも、世界には同じ問題を克服した人がいるかもしれません。
こういう時インターネットって素晴らしい!と心底思いますね。

Twitterハイライト

メルマガ出さないくせに色々つぶやいてましたスミマセン

これ崖の上で吠える◯ッキーマウスに見えへん?

パンチとキックのある野球ゲーム

愛人をつくるには、どうしたらいいのですか

悪魔城伝説 幻の5人目の仲間

ドラクエの「つるぎ」と「けん」の違い

種類が多すぎる!ドラクエ4の広告

クイズあのゲームの文字?? の答え

さて、前回出題したクイズあのゲームの文字??の答えです。
こんな問題でした。

次の○に入る文字は何でしょうか?
か → こ → く → ぜ → ○ → け
ヒント
・ある有名ゲームに関する問題です
・プログラミングを知らなくても解けます。

正解は ね でした。

これ、ファイナルファンタジーのラスボスの頭文字になってます。
1 カオス
2 皇帝
3 暗闇の雲
4 ゼロムス
5 ネオエクスデス
6 ケフカ
ってな具合です。

今回は2人の方に応募いただき、2名とも正解でしたパチパチ。

お二人にはAmazonギフト券を送信しました。
ファファファ豪遊するが良い。

クイズなんの英単語?

では今回のクイズです。

次の英単語にはある共通点があります。
それは何でしょうか?

Cafe, Bad, Dead, Face, Beef

応募は本メールに返信すればOKです。

正解した方の中から抽選で3名様に、Amazonギフト券コード(500円)を送信致します。
締切は次号の配信まで。ご応募お待ちしてます!
※募集は終了しました

今回はここまでです。読んでいただきありがとうございました。

プログラミング書籍の館 江畑


Kuniaki Ebata 登録者

大学中退(文系)の専門卒 日本で唯一のプログラミング書籍評論家 プログラマーで現役のスキー国体選手です 頭と体を動かすのが大好きなフレンズなんだね 専門学校で先生もやってます プログラミングは21歳から 貴族じゃない独身 持病:重度うつ病(薬とサポートのおかげで何とか生きてます) 教え子をゲーム業界へどんどん送り込み、世界を面白くする野望を実現中 プログラミングが上達するメルマガやってます ここを見たゲーム業界の卒業生へ 新作が出たら、連絡するか現物を送ってくれると嬉しいです ただし18禁・CERO-Dの場合は、厳重に梱包の上、品名をパソコン部品にて送る事(だいじ) このページが参考になった方へ ぜひSNSやブログでシェアして欲しいです お願いします(少し上にボタンあります) 最近Google先生が中身の無い「いかがでしたか?」サイトを優遇するので困っています助けて下さい(>_<) シェアしてくださった方には 小冊子 プログラミング書籍が10倍わかる読み方(pdf) を差し上げます こちらからご報告頂くか、こっそりDMを送って下さい