Wiki

Clone wiki

CardWirthPy Reboot / TipsForBugReporting

不具合報告のコツ

CardWirthPyに限らず、ソフトウェアには不具合があり、不具合に遭遇したユーザが開発者に報告して直してもらう、という事はよくあります。

しかし、開発者も人間ですから、情報が不足していたり曖昧だったりする不具合報告を受けてもどうしようもない事があります。

たとえば、不具合報告の内容が「マウスでクリックしたら止まった」だけだったら、報告を受けた側にできる事は「止まったとはどういう状態か? 何をしていて何をクリックしたのか? どういうマシンでどういうOSが入っている環境で遊んでいたのか?……」と情報を求めて聞き返す事だけです。

不具合報告にはコツがあります。報告に適切な情報が入っていれば、無駄なやり取りを大幅に減らす事ができます。

必要な情報は、大抵の場合、次の5点です。

  • どのような不具合か
  • 不具合の再現方法
  • 実行環境
  • CardWirthPyのビルド情報
  • エラーログ

常にこれら全てが必要というわけではありませんが、あればあるほど調査が容易になり、解決が早くなる事を期待できます。

以下に、どのようにすればそのような情報を得られるかを記します。


目次


どのような不具合か

最優先で報告に含めるべき情報は、「どのような不具合か」「不具合の再現方法」の2つです。

それも、具体的でなければなりません。「クリックしたら止まった」ではなく、「『ゴブリンの洞窟』で、洞窟の入口の『見張り』を選択し、メッセージの2番目の選択肢をクリックしたら操作不能になった」というように、可能な限り詳しく書きましょう。

しかし、あまりにも手順が複雑だと、かえって正確に伝わらない場合があります。そこで、「再現方法」の確認が必要になってきます。


不具合の再現方法

不具合の「再現」とは、改めて同じ不具合を発生させる事です。トラブルが発生するまでの手順が分かっていれば、同じ手順を辿って同じトラブルを何度も発生させる事ができます。

これは実は非常に重要な事で、不具合の原因調査の成否は大抵、不具合の再現が可能か否かにかかっています。

不具合の再現ができるという事は、開発者がその不具合を見る事ができるという事です。見た事も無い現象を想像して調べるのと、目の前で起きている現象を調べるのとでは、難易度がまるで違います。

ですから、「不具合を再現する手順が分かっているか」「簡単に再現する方法はあるか」は、不具合報告において最も重要なポイントです。

以下のような方法で、不具合の内容を調べてみるとよいでしょう。

問題が再現するか試す

あるシナリオをプレイして不具合に遭遇したのであれば、もう一度同じシナリオを同じようなやり方でプレイし、同じ現象が発生するかを確認しましょう。

それで何度も同じ事が起きるようであれば、まずは再現方法が分かった事になります。不具合発生に至るまでの手順をメモして報告に含めるとよいでしょう。

仕様やシナリオのバグではない事を確認する

発生したトラブルは、実はCardWirthの仕様だったり、シナリオのイベントの作り方が正しくないせいで発生した問題、つまりエンジンではなくシナリオのバグだったりするかもしれません。

それを調べる方法はいくつかありますが、CardWirth 1.50のような他のCardWirthエンジンで再現手順を踏んでみる、というのが最も簡単です。もしもCardWirth 1.50でも同じ現象が発生するようであれば、それはCardWirthPy固有のバグではない可能性が高いです。

エディタを扱えるのであれば、デバッガを使ってイベントの実行状況を詳しく調べてみるとよいでしょう。それでイベントのバグが発見できるかもしれません。

この挙動はシナリオの作りのせいではないし、CardWirthの仕様としてもどう考えてもおかしい、他のエンジンの挙動とも食い違う、となれば、それはCardWirthPyのバグである可能性が高くなります。

初期状態のCardWirthPyでテストする

不具合が再現する事が分かっても、CardWirthPyの設定などによって状況が異なり、他の環境では同じ事をしても問題が再現しない、という事もありえます。

そこで、次の事を試してみてください。

新しくCardWirthPyをダウンロードして、新しいプレイ環境を作ります。その後、不具合の再現手順を実行して、同じ不具合が発生するか試してみます。

もしもそれで不具合が発生するようであれば、発生源のシナリオと手順さえ知っていれば、誰でも同じ不具合を発生させる事ができるはずです。

初期状態では発生しないようであれば、なんらかの設定が不具合に関係していると考えてよさそうです。不具合が発生する環境の設定に少しずつ近づけていきながら再現手順を繰り返す事で、どの設定が原因になっているのかが分かるかもしれません。

また、余裕があるようなら、最新のテスト版や数日前のバージョンで試す事で、どこからバグが入ったのか、実は修正済みではないか、といった事が分かるかもしれません。

テストシナリオを作る

あるイベントコンテントで不具合が発生するのであれば、最初に発生した時にプレイしていたシナリオだけではなく、他のシナリオでも発生するかもしれません。

エディタを扱えるのであれば、新しくテスト用のシナリオを作り、不具合の発生源となりそうなイベントを入れてみて、再現するか試してみる事をおすすめします。

新規シナリオで不具合を発生させる事ができれば、そのシナリオを不具合の再現テスト用兼動かぬ証拠として開発者に渡す事で、問題の解決へ大幅に近づく事ができます。

テスト宿を作る

エンジンの不具合はシナリオの中で発生するとは限りません。たとえば「宿にいる時、ある特定のパーティでパーティ名を『□△×』に変更した時にエラーが起きる」というようなバグはシナリオとは関係無いはずです。

その場合でも、再現用の状況を作って開発者に渡す事ができれば、大いに調査の役に立ちます。不具合の条件の見当がついたら、その条件を満たす新しい宿を作って実際に再現するか確認し、再現手順と一緒に開発者へ渡すといいでしょう。


再現方法以外で報告に含めるべき情報

情報は再現方法だけでは充分ではないかもしれません。

実行環境、CardWirthPyのビルド情報、そして不具合が発生した時にエラーログが出力されていればその内容も、できるだけ開発者に渡した方がよいでしょう。

実行環境を明記する

めったに無い事ですが、Windowsのバージョンなどの環境が不具合の発生に影響している事があります。

「実行環境はWindows 7 Home(64-bit)、メインメモリは4GB、128GBのSSD」のように、実行環境を明記しておくと、調査の役に立つ場合があります。

CardWirthPyのビルド情報を明記する

CardWirthPyの設定ダイアログを開くと、画面下に

CardWirthPy 2.0 Beta 1
Build: 2017-05-20 13:50:08

のような文字列が記されている欄があります。

この文字列は、お使いのCardWirthPyの本体がいつ構築されたものであるかを表しています。一種のバージョン情報です。

不具合は、あるバージョンでは起きても他のバージョンでは起きないかもしれません。この情報をコピーして報告に付け加えておくと、調査の役に立つ事があります。

エラーログを貼り付ける

エラーが発生したり、操作不能になった後、CardWirthPyを閉じると

See the logfile 'D:\CardWirthPy\CardWirthPy.exe.log' for details

というようなメッセージが表示される事があります。

このメッセージは、「エラーの詳細をログファイルCardWirthPy.exe.logに残したので見てね」という意味です。

これが表示されたら、CardWirthPy.exeと同じフォルダにCardWirthPy.exe.logというテキストファイルが生成されているはずです。その中には以下のような感じのエラーログが含まれています。

Version : 2.0 Beta 1 / 2017-05-20 15:16:38
DateTime: 2017-05-20 15:17:02
Traceback (most recent call last):
  File "cw\thread.pyo", line 728, in run
  File "cw\thread.pyo", line 758, in _run
  File "cw\thread.pyo", line 763, in main_loop
  File "cw\eventhandler.pyo", line 113, in run
  File "cw\eventhandler.pyo", line 626, in executing_event
  File "cw\thread.pyo", line 1908, in set_yado
  File "cw\data.pyo", line 58, in __init__
  File "cw\data.pyo", line 144, in _init_sparea_mcards
  File "cw\thread.pyo", line 2957, in set_mcards
  File "cw\sprite\card.pyo", line 1157, in __init__
  File "cw\sprite\card.pyo", line 1210, in initialize
  File "cw\image.pyo", line 674, in __init__
  File "cw\image.pyo", line 225, in __init__
  File "cw\image.pyo", line 232, in update_scale
  File "cw\setting.pyo", line 2625, in __getitem__
  File "C:\Python27\lib\site-packages\py2exe\boot_common.py", line 67, in write
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

このエラーログは、開発者から見ると、「プログラムの中のどこでエラーが発生したのか?」という事を示す、非常に役立つ情報です。エラーログがある場合は、ぜひそれを報告に含めましょう。

DateTime: 2017-05-20 15:17:02となっている行に注意してください。ここにはエラーログが出力された日時が書かれています。

エラーログは、放置しておくと、エラーが発生するたびにログファイルに追記される形でどんどん増えていきます。そのため、CardWirthPy.exe.logには、報告したい不具合とは関係無いログが含まれているかもしれません。

その場合、ログの出力日時を見て、関係ありそうなログだけを抜き出すようにしましょう。大抵は一番最後のログになるはずです。

ログの出力日時が書かれていない場合もありますが、その場合はとりあえず一番最後のログを抜き出すとよいでしょう。


不具合報告の例

長々と説明されてもピンと来ないかもしれませんので、以下に架空の報告を例として書いておきます。

バグ: 空白時間スキップ不可設定で2つ目の選択肢をクリックすると止まる

  • Kind: bug
  • Priority: major
  • 添付ファイル: 2selclickbug.zip

「空白時間をスキップ可能にする」がオフになっていると、どのシナリオでも、メッセージの2つ目の選択肢をクリックすると操作不能になってしまいます。

「ゴブリンの洞窟」の見張りをクリックし、「おびき寄せる」をクリックすると止まってしまったので、調べてみたところ、どのようなシナリオでも同じバグが発生するようでした。キーボード操作で選択した時は問題ありません。

初期状態のCardWirthPy(Version : 2.0 Beta 1 2017-05-20 15:16:38)では発生しなかったので、設定を1つずつ変更してみたところ、どうも詳細の「空白時間をスキップ可能にする」のチェックが外れている時に限って問題が起きるようです。

再現用のシナリオを添付しておきます。

このバグが発生した時には以下のようなエラーログが出力されていました。

Version : 2.0 Beta 1 / 2017-05-20 15:16:38
DateTime: 2017-05-20 15:17:02
Traceback (most recent call last):
  File "cw\thread.pyo", line 728, in run
  File "cw\thread.pyo", line 758, in _run
  File "cw\thread.pyo", line 763, in main_loop
  File "cw\eventhandler.pyo", line 113, in run
  File "cw\eventhandler.pyo", line 626, in executing_event
raise Exception
  Exception

たぶん関係無いと思いますが、プレイ環境はWin10 Pro(64bit)、メモリ4GBです。

Updated