web-dev-qa-db-ja.com

Flash /ActionScript3.0のStackTrace

コードの任意の関数でスタックトレースを確認したいので、次のようなものを作成して呼び出し、スタックトレースを出力します。

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ブロックでこの機能をラップできます。

51
hasseg

Flash Player 11.5から、スタックトレースは非デバッガーバージョンのプレーヤーでも利用できます。

8
Glen Blanchard

FlexSDKに付属のFlexDeBugger(FDB)を使用します。これはコマンドラインデバッガーであり、オンラインのものも含めて.swfをデバッグできます(デバッグバージョンの場合)。これにより、ブレークポイントの設定、変数の出力/変更、スタックのダンプ、および 余分なコードを追加する必要はありません。なくてはならない非常に便利なツールです!

必要なfdbオプションは、「break」で実行を停止するクラスと行を指定し、「bt」または「infostack」でスタックのバックトレースを提供します。また、実行中にアプリケーションに関するほとんどすべてを表示することもできます。

6
Joony

私はこの小さな関数をまとめました:

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()関数を呼び出す行を指します)が、「スタック」の開始点として使用するために残しました。痕跡"。

2
OMA

@hassegは正しいです。 SWFのコンパイル時に-compiler.verbose-stacktraces = trueを指定することにより、リリースバージョン(デバッグではない)でスタックトレース情報を保持することもできます。

2
plam4u
var tempError:Error = new Error();
var stackTrace:String = tempError.getStackTrace();

このstackTrace文字列を任意のファイルに書き込んで、実行モードでもプログラムのログを確認できるようにします。したがって、デバッガモードでのみ実行する必要はありません。アプリケーションのuncaughtexceptionイベントに書き込むと、最後に実行されます。

1
gaurav_gupta

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

0
Andrei Tofan