MOD/作成情報/Pythonデバッグ手法
ログ
CivilizationIV.ini を編集してログ出力をonに。
LoggingEnabled = 1 SynchLog = 1 OverwriteLogs = 1
My Documents\My Games\Beyond the Sword(J)\Logs に PythonErr.log, PythonDbg.log が出力される。
ポップアップは煩わしいので HidePythonExceptions は有効に、ログファイルを直接見た方が良い。tail -f もしくはそれに類するツール(例えばTail for Windows)を使うとリアルタイムでログが見られるので便利。
Python Console
CivilizationIV.ini で
CheatCode = chipotle
とすると、ゲーム中Shift+@(英語キーボードではShift+~)でPython Consoleが開く。入力は英字配列として認識されるの注意。またCtrl+zでデバッグモードになる。
プリント
最も手軽な手法である。任意の箇所にprint文を挿入し、PythonDbg.logに出力する。
print "ok, works fine."
CvUtil.pyPrint() を呼ぶのが行儀の良い作法だが、別にprintだけでも良い。
デバッガ
HAP Python Remote Debugger が利用できる。SourceForge.net: HAP Python Remote DebuggerからダウンロードしてHapDebugger.exeを起動。おそらくpython24.dllがないと言われるので適当に入手して同フォルダに置く。CivilizationIV.ini で
HAPDebugger = 1
としてゲームを起動。フルスクリーンにすると操作が利かなくなるのでwindowモードで。InitPythonと表示されて起動が止まる。HapDebuggerに何でもいいのでPythonファイルをドラッグして開き、メニューの Debug > Connect Remote Debug... を選択、そのままOKを押すとデバッグが開始されゲームが再開する。使い方は一般的なデバッガと同様。
デバッガの使い方
Pythonファイルを開いて、興味のある行の左側をクリック。赤丸が出る。この位置をブレークポイントと呼ぶ。ゲームが進行してプログラムがブレークポイントに達すると、ゲームが一時中断されてデバッガがアクティブになる。
メニューの View > Debug Windows から有益な情報が得られる。
- Call Stack
- どの関数を経由して今の位置にいるかがわかる。上画像の場合は CvEventInterface.onEvent() の中で呼ばれた CvEventManager.handleEvent() の中で呼ばれた CvEventManager.onEndPlayerTurn() の中にいることを表している。
- Locals/Globals
- 変数の値。タブでグローバル変数/ローカル変数の切り替え。変数の値はエディタ中でマウスオーバーしても見られる。
- Debug Outputs
- ログファイルの内容が表示される
デバッガ上部のツールボタンでプログラムの実行を操作する。現在位置はCall Stackで確認。
- Step In
- 現在の行にある関数の中に移動
- Step Over
- 次の行に移動
- Step Out
- 現在の関数の呼び出し元に戻る
- Go
- ゲームを再開する
このようにデバッガを使うと実行中のコードを調べる事ができる。