コードの任意の関数でスタックトレースを確認したいので、次のようなものを作成して呼び出し、スタックトレースを出力します。
public function PrintStackTrace() {
try {
throw new Error('StackTrace');
} catch (e:Error) {
trace(e.getStackTrace());
}
}
これを行う他の方法があるかどうか知りたいです。ある場所では、Errorクラスがスタックトレースを作成しますが、ActionScript 3.0では作成されなかった可能性があるため、不可能な場合もありますが、知りたいのですが。
ありがとう!
私の知る限り、スタックトレースを独自のコードで使用できるようにする唯一の方法は、すでに行っているように、Errorクラスの getStackTrace() メソッドを使用することです。ただし、質問の例に応じて、実際にエラーをスローする必要はありません。エラーを作成して、そのメソッドを呼び出すだけです。
var tempError:Error = new Error();
var stackTrace:String = tempError.getStackTrace();
また、ドキュメントに記載されているように、これはFlash Playerのデバッグバージョンでのみ機能するため、必要に応じて Capabilities.isDebugger の値をチェックするifブロックでこの機能をラップできます。
Flash Player 11.5から、スタックトレースは非デバッガーバージョンのプレーヤーでも利用できます。
FlexSDKに付属のFlexDeBugger(FDB)を使用します。これはコマンドラインデバッガーであり、オンラインのものも含めて.swfをデバッグできます(デバッグバージョンの場合)。これにより、ブレークポイントの設定、変数の出力/変更、スタックのダンプ、および 余分なコードを追加する必要はありません。なくてはならない非常に便利なツールです!
必要なfdbオプションは、「break」で実行を停止するクラスと行を指定し、「bt」または「infostack」でスタックのバックトレースを提供します。また、実行中にアプリケーションに関するほとんどすべてを表示することもできます。
私はこの小さな関数をまとめました:
public static function getStackTrace() : String
{
var aStackTrace : Array = new Error().getStackTrace().split("\n");
aStackTrace.shift();
aStackTrace.shift();
return "Stack trace: \n" + aStackTrace.join("\n");
}
この関数は、開発時にアプリで使用するカスタムの「デバッグ」クラスにあります。 2つのshift()呼び出しは、最初の2行を削除します。最初の行は単なる文字列「Error」であり、2番目の行はこの関数自体を参照しているため、役に立ちません。必要に応じて、別のshift()呼び出しを追加することで、3行目を削除することもできます(getStackTrace()関数を呼び出す行を指します)が、「スタック」の開始点として使用するために残しました。痕跡"。
@hassegは正しいです。 SWFのコンパイル時に-compiler.verbose-stacktraces = trueを指定することにより、リリースバージョン(デバッグではない)でスタックトレース情報を保持することもできます。
var tempError:Error = new Error();
var stackTrace:String = tempError.getStackTrace();
このstackTrace
文字列を任意のファイルに書き込んで、実行モードでもプログラムのログを確認できるようにします。したがって、デバッガモードでのみ実行する必要はありません。アプリケーションのuncaughtexception
イベントに書き込むと、最後に実行されます。
Flash 11.5以降、スタックトレースはFlashのリリースバージョンで機能します。
しかし、それはこれがもはや問題ではないという意味ではありません。アプリケーションがFlash Builder --> Project properties --> ActionScript Compiler
で11.5より古いコンパイラを使用するように設定されている場合、スタックトレースはありません。
さらに、同じページにAIRSDKのバージョンが表示されます。 v3.4以前を使用している場合、スタックトレースは表示されません。これが問題である場合は、すべての開発者が指示に従ってAIRSDKを更新する必要があります ここ 。
getStackTrace
メソッドは、デバッグフラッシュプレーヤー( https://www.Adobe.com/support/flashplayer/debug_downloads.html )でのみスタックトレースを返し、リリースプレーヤーではnull
。デバッグプレーヤーがインストールされ、実行されていることを確認してください。
-compiler.verbose-stacktraces=true
は、デバッグスタックトレースに行番号を追加するだけです。
サンプルテスト: https://Gist.github.com/pipeno/03310d3d3cae61460ac6c590c4f355ed