Pythonデバッグ手法

MOD/作成情報/Pythonデバッグ手法
Last-modified: 2009-06-04 06:40:35

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ファイルを開いて、興味のある行の左側をクリック。赤丸が出る。この位置をブレークポイントと呼ぶ。ゲームが進行してプログラムがブレークポイントに達すると、ゲームが一時中断されてデバッガがアクティブになる。

hapdebugger.png

メニューの View > Debug Windows から有益な情報が得られる。

Call Stack
どの関数を経由して今の位置にいるかがわかる。上画像の場合は CvEventInterface.onEvent() の中で呼ばれた CvEventManager.handleEvent() の中で呼ばれた CvEventManager.onEndPlayerTurn() の中にいることを表している。
Locals/Globals
変数の値。タブでグローバル変数/ローカル変数の切り替え。変数の値はエディタ中でマウスオーバーしても見られる。
Debug Outputs
ログファイルの内容が表示される

デバッガ上部のツールボタンでプログラムの実行を操作する。現在位置はCall Stackで確認。

Step In
現在の行にある関数の中に移動
Step Over
次の行に移動
Step Out
現在の関数の呼び出し元に戻る
Go
ゲームを再開する

このようにデバッガを使うと実行中のコードを調べる事ができる。