====== 3点のDIFFによるバグの自動検出 ====== \\ ちゃんとバックアップを取ってきた方のための機能です。\\ \\ 作ったROMに原因不明のバグが発生したとします。\\ このバグとは、何度も設定を確認しても、間違いないのに、なぜかゲームがフリーズして動かないなどの修正するのが困難なバグです。\\ FEBuilderGBAは、ROMを守るためにいろいろな手段を使っていますが、それでも発生しないとはいい切れません。\\ この機能は、そのバグの原因を、バックアップデータとのDIFFを取ることにより、自動的に検出する機能です。\\ \\ {{ https://i.imgur.com/PGYPMy7.jpg }} ===== Jenkinsはいない ===== FEはSRPGです。最初から通しプレーをするには時間がかかるゲームです。\\ 中盤のステージを作ってると、序盤のステージのテストプレイがおろそかになります。\\ そして、中盤のステージを作っている時、序盤の領域を破壊したとしても、それに気が付きません。\\ 残念ながらGBAFEには、CIのJenkinsのようなものはまだ存在しません。\\ 壊したことが気が付かずに、しばらく経ってからの通しプレーでバグに気がつくというのがよくあるケースです。\\ \\ ===== エミュレータでバグが再現するところまで進める ===== {{ https://i.imgur.com/PGYPMy7.jpg }} \\ まずは、バグが再現するところまで、エミュレータでゲームを進めてください。\\ バグが再現する所まで来たら、このツールの出番です。\\ (このツールを起動する前に、書き込んでいないデータがあったら保存してください。)\\ \\ ===== 比較デバッグツールの起動 ===== {{ https://i.imgur.com/e6HNTl2.jpg }} \\ メニューから、ツール->比較デバッグツールを選択してください。 \\ ===== 画面説明 ===== {{ https://i.imgur.com/2QhvUMl.jpg }} \\ このツールを起動すると、バックアップデータが日付順に表示されます。\\ リストの上のデータが新しく、下に行くほど古いデータです。\\ リストをダブルクリックすると、エミュレータが自動的に起動します。\\ 7z圧縮やupsなども自動的にgba romへ変更されエミュレータが起動します。\\ \\ ===== 最後に正しく動作したROMを探す ===== バックアップのリストから、「バグが発生しない最も日付が新しいバックアップ」を探してください。\\ ==== 実際にやってみる ==== 今回は、テストなので3つしかデータを用意していません。\\ 実際にはたくさんのデータが並んでいるものと思います。\\ \\ {{ https://i.imgur.com/EFTRkm6.jpg }} \\ とりあえず、リストの一番下にある一番古いバックアップを見てみましょう。\\ リストの項目をダブルクリックすると、エミュレータが起動します。\\ \\ {{ https://i.imgur.com/VLWGWt0.jpg }} \\ 普通に動作しました。\\ これは正しいデータのようです。 \\ エミュレータを閉じて、次のデータを見てみましょう。\\ \\ {{ https://i.imgur.com/XbUPwzZ.jpg }} \\ 真ん中にあるデータを見てみましょう。\\ 同様に、リストの項目をダブルクリックしてエミュレータを起動させてください。\\ \\ {{ https://i.imgur.com/cb9XbcE.jpg }} \\ これも普通に動作しました。\\ これは正しいデータのようです。 \\ \\ {{ https://i.imgur.com/i307yPF.jpg }} \\ では、リストの一番上にあるバックアップはどうでしょうか?\\ リストの項目をダブルクリックしてエミュレータを起動させてください。\\ \\ {{ https://i.imgur.com/JWFnDWg.jpg }} \\ バグが再現しました。\\ このデータは壊れているようです。\\ \\ {{ https://i.imgur.com/ktDH4IY.jpg }} \\ では、正しく動く、最新のバックアップデータはどれですか?\\ それは、真ん中のデータです。\\ \\ 一番上の最新のバックアップデータは壊れていました。\\ そのため、正しく動作した最後のデータは、2番目のデータということになります。\\ \\ ここを間違わないように注意してください。\\ 壊れたデータではなく、正しく動く、最新のバックアップデータを探しています。 \\ 当然ですが、一番下ではありません。\\ 一番下は正しく動きますが、正しく動く最新のデータではありません。\\ \\ 正しく動く最新のデータは、2番目のデータです。\\ これは重要なポイントです。\\ \\ {{ https://i.imgur.com/tHtzvji.jpg }} 正しく動く最新のデータを見つけたら、右下にあるボタンを押して、3点DIFFを取得します。\\ \\ ===== 正しく動く最新のデータの重要性について ===== 正しく動く最新のデータはとても重要です。\\ \\ 必ず、バグが発生しない最も日付が新しいバックアップを探してください。\\ バグが発生しないバックアップではなく、バグが発生しない最も日付が新しいバックアップです。\\ \\ バグが発生しない最も新しいバックアップの次の世代のバックアップデータは、\\ バグが発生する最も古いバックアップデータということになります。\\ \\ つまり、この両者の差分の何処かがバグを発生させているデータです。\\ \\ プログラムは思ったとおりではなく、書かれたとおりにしか動きません。\\ なにかを間違って書いているからバグが発生するのです。\\ よって、二つのROMの差分のどこかに必ずバグが潜んでいます。\\ 犯人はこの差分の中に必ずいます。探し出しましょう。\\ \\ ただ、いろいろ変更している場合、変更箇所も多くなるでしょう。\\ そうなると、探し出すのは困難です。\\ そのため、もう一つ、現在のROMデータとも差分を取ることで範囲を絞り込みます。\\ \\ なぜなら、現在のROMにも同様にバグが発生しているためです。\\ 現在のROMにも同様のバグが発生しているということは、現在のROMにも同様のデータがあるというわけです。\\ \\ 両者の差分のうち、現在のROMにも存在するデータがバグを発生させるデータということになります。\\ \\ 名前が長くなるので、このツールでは以下のように呼びます。\\ バグが発生しない最も新しいバックアップを OK ROM と呼びます。\\ バグが発生する最も古いバックアップを NG ROM と呼びます。\\ 現在のROMを CURRENT と呼びます。\\ \\ OK ROMにはあって、 NG ROMにないもの。\\ 且つ、OK ROMにはあって、CURRENTにはないもの。\\ 且つ、NG ROMと CURRENTに存在するもの。\\ \\ この3つの条件を満たすデータを、3点DIFFを使い求めます。\\ ボタンを押してください。\\ \\ ===== 比較方法選択 ===== {{ https://i.imgur.com/HnUzcYl.jpg }} \\ 比較方法が出てきますが、一番上の方法を選びます。(これが先ほど説明した条件です)\\ そうすると、計算が行われ、3点DIFFの結果がリストに表示されます。\\ \\ {{ https://i.imgur.com/UxGB3MA.jpg }} \\ \\ この中にバグを発生させているデータがあります。\\ 見つけ出しましょう。\\ (今回は1つしかないですね。) \\ \\ リストアップされた差分を適当に適応してみましょう。\\ 1キーを押すと、 OK ROMのデータを書き込みます。\\ 2キーを押すと、 NG ROMのデータを書き込みます。\\ 3キーを押すと、CURRENTのデータを書き込みます。\\ 0キーを押すと、CURRENTのデータを書き込みマークを解除します。\\ \\ {{ https://i.imgur.com/hu9XD8i.jpg }} \\ 基本的に、1キーを押してデータを書き込んでください。\\ データを書き込んだから、F5キーを押してエミュレータを起動してください。\\ バグは解決されましたか?\\ \\ バグが解決されていないならば、このデータではないようです。\\ 次のデータを書き込んでみましょう。\\ \\ もちろん、無理やり差分データを書き込んでいるわけですから、ゲームが動かなくなることもあります。\\ その場合は、3キーを押して、CURRENTのデータに戻します。\\ \\ こうやって、差分をマージしていきましょう。\\ \\ {{ https://i.imgur.com/DZmH9nF.jpg }} \\ もし、バグが解決されたとしたら、それがバグを引き起こしているデータです。\\ そのデータのアドレスと、書き込まれた内容から、原因を推測しましょう。\\ \\ バグを解決したアドレスを見つけ出したら、そのデータ以外のデータは無関係だと思われるので、3キーを押してCURRENTに戻しましょう。\\ このときも、データを戻しながらバグが再発しないかを確認していきます。\\ もしかすると、犯人は単独ではなく複数犯かもしれません。注意しましょう。\\ \\ \\ さて、データをマージしたことで、問題は解決しました。\\ もし、差分をマージしたことによって、問題が解決するならば、それでもいいでしょう。\\ それでは心配だという場合は、データが書き込まれたアドレスに何があるかを調査してみましょう。\\ デバッガーを利用して、ブレークポイントを設置して挙動を観察しましょう。\\ なにか、奇妙なものがそこにあるはずです。\\ \\ 今回は、マップ設定で、誤ったマップオブジェクトを指定していましました。\\ 本来0x01 を指定しないといけないのに、 0x02を指定していたため、画面が壊れてしまいました。\\ {{ https://i.imgur.com/RxFJoU8.jpg }} \\ \\ \\ この方法を利用すると、大抵の不可解なバグを1時間ぐらいで修正することが出来ます。\\ どうしても、原因がわからないバグが発生したら、この方法でバグデータを探してみるといいかもしれません。\\ ===== 補助機能 ===== {{ https://i.imgur.com/UxGB3MA.jpg }} \\ データのマージをしていて、訳がわからない状態になったら、右下のボタンを押してください。\\ 「変更をすべてキャンセル」します。\\ マージを開始する直前のデータにデータをすべて巻き戻します。\\ これで何度でもマージをやり直すことが出来ます。\\ \\ ツールの使い方に慣れてきたら、楽をしましょう。\\ 大量にデータがある場合は、SHIFTキーを押しながら1キーを押してください。\\ データを書き込んで次のデータへフォーカスを自動的に移動します。\\ キーをずっと押しっぱなしにすると、どんどん書き込みを続けます。\\ 半分ぐらいマージしてから動作を確認するという二分探索のようなことをしてもいいかもしれません。\\ ===== 元ネタ ===== この機能は、私が昔書いた、バイナリ比較でバグ修正を簡易化したものです。\\ バイナリ比較ツールなどで2点マージでは面倒なので、3点マージにして、変更点を絞り込み、楽にマージできるようになっています。\\ \\ http://ngmansion.xyz/wiki/hackfe/index.php?cmd=read&page=%E8%A7%A3%E8%AA%AC%2F%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E6%AF%94%E8%BC%83%E3%81%A7%E3%83%90%E3%82%B0%E4%BF%AE%E6%AD%A3