2009年01月13日
Alchemy で内部ログを出力するには環境変数 LOGLEVEL を設定する
LOGLEVEL を設定すると、Alchemy の内部ログが出力されるようになる。
libc 部分の組み込み関数や Alchemy の内部処理の情報が出力されるので、デバッグ時に役立つ。
cygwin ではこんな感じ。
$ export LOGLEVEL=6
LOGLEVEL は1~5まである模様。数字が大きいほど細かいログも出力するようになる。6だと1~5の全部を吐く。
ログは trace として吐かれる。注意しなきゃいけないのは、LOGLEVEL の値はコンパイル時に埋め込まれるので、レベルを変更するには再コンパイルする必要がある。
ログの例
ためしに、6 にしてビルドすると、初期化時にはこんなログが出力された。
local system local system w/o gsprite Static init... Undefined sym: _abort Starting work... _init Caught AlchemyLibInit 3
コンパイル時の流れ
gcc のソースを見てみる。
LOGLEVEL 環境変数の値がコンパイル時のパラメータとして渡されている。
$confShell = $avmshell ? "true" : "false"; $confNoShell = $avmshell ? "false" : "true"; $confLogLevel = $ENV{LOGLEVEL} || "0"; $confVector = $ENV{NOASVECTOR} ? "false" : "true"; $confNoVector = $ENV{NOASVECTOR} ? "true" : "false"; $setjmpAbuse = $ENV{SETJMPABUSE} ? "true" : "false"; $confDebugger = $debug ? "true" : "false"; $confNoDebugger = $debug ? "false" : "true"; push(@asc, "-config", "Alchemy::Debugger=$confDebugger", "-config", "Alchemy::NoDebugger=$confNoDebugger", "-config", "Alchemy::Shell=$confShell", "-config", "Alchemy::NoShell=$confNoShell", "-config", "Alchemy::LogLevel=$confLogLevel", "-config", "Alchemy::Vector=$confVector", "-config", "Alchemy::NoVector=$confNoVector", "-config", "Alchemy::SetjmpAbuse=$setjmpAbuse" );
AS のコード
gcc が吐き出す AS3 のコードはこんな感じ。
(※中間ファイルの吐き出し方は Alchemy で中間ファイルを消さない設定 を参照)
public var glogLvl:int = Alchemy::LogLevel; public function log(lvl:int, msg:String):void { if(lvl < glogLvl) trace(msg); }
Alchemy::LogLevel の値はコンパイル時に -config で指定された値が設定される。つまり、glogLvl には LOGLEVEL の値が格納される。
よって、log 関数では LOGLEVEL の値よりも小さいログレベルのログが trace に吐かれることとなる。