12

私が得ているスタックアンダーフローを解決するのに本当に苦労しています。実行時に取得するトレースバックは次のとおりです。

VerifyError: エラー #1024: スタック アンダーフローが発生しました。

flash.events::EventDispatcher/dispatchEventFunction() で
flash.events::EventDispatcher/dispatchEvent() で
flash.net::URLLoader/onComplete() で

これは、デバッグ モードで実行するとまったく発生しないため、デバッグが特に困難です。リリースとしてコンパイルされた場合にのみ発生します。

スタックアンダーフローをデバッグする方法に関するヒントはありますか? それが Flash にとって何を意味するかについて明確な説明がありますか?

それが役立つ場合、このエラーは、ハンドラーが URLLoader、AsyncToken を使用する RPC 呼び出しを行い、AsyncToken に関連付けられた AsyncResponder インスタンスのセットを呼び出すボタンをクリックすると発生します。一部のサーバー側のログと、swf にハッキングされた一部のログにより、UrlLoader が正常に実行され、crossdomain.xml ファイルを GET し、正しく処理されていることがわかります (つまり、それを破壊した場合、セキュリティを取得します)エラー)、また「ロード」リクエストを正常に完了しています (サーバーがデータを送信します)。アンダーフローは、Event.COMPLETE のリッスン/処理プロセスで発生しているようです (もちろん、トレースバックでも暗示されています)。

使用される mxmlc = flex_sdk_4.5.0.20967 から

プレーヤーの例 (いくつか試しました) = 10.2.153.1


更新:私の特定の問題は解決されました...しかし、特定の解決策を得るのではなく、そのような問題を一般的にデバッグする方法を知りたいので、質問をそのままにしておきます。

私のコードには、次のアプリケーション定義がありました。

<s:Application height="100%" width="100%"
                              xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               initialize="InitData();">

コードがinitializeイベントに添付されている/添付されていたことに注意してください。

InitData() と関連する定義は次のとおりです。

import classes.RpcServerProxy;
public var SP:RpcServerProxy;

public function InitData():void {
    SP = new RpcServerProxy("http://192.168.1.102:1234");
}

InitData() 呼び出しを(J_A_X に感謝します!)onCompletion代わりにイベントに切り替えると、問題は完全に解消されます。initializeEvent.COMPLETE イベント ハンドラ (スタック トレースの onComplete) がグローバル SP オブジェクトを使用していたようです。リリース (vs デバッグ) コンパイルに関する何かが、SP 変数の初期化の開始タイミングに影響を与えていたに違いありません。ハンドラーを後でonCompletionイベントに移動すると、すべての問題が解決しました。

上記のように、このような初期化の問題をデバッグするために利用できるトリック/ツールを知りたいです。


更新 2:

applicationCompletecreationCompleteアプリケーションの初期化コードを配置するよりも優れたイベントのようです。説明についてはこのブログエントリを参照してください。また、単純な「アプリケーションの開始」データ初期化の例については、Adobe Tech Evangelist によるこのビデオ(4:25 あたり) を参照してください。

4

9 に答える 9

12

コンパイラ引数を追加することで、このエラーを取り除きました:
-omit-trace-statements=false

于 2012-09-13T13:23:05.243 に答える
4

スタックアンダーフローは、基本的にコンパイラがめちゃくちゃになったことを意味します。

どのように混乱したかを正確に知りたい場合は、SWFWire インスペクターを使用してイベント ハンドラーのバイトコードを調べることができます。SWFWire Debuggerを使用して、どのメソッドが呼び出されたかを確認することもできますが、この場合は、それがどこで行われているかが既にわかっています。

壊れた SWF を投稿していただければ、より多くの情報を提供できます。

于 2011-06-08T01:56:08.193 に答える
3

Sean の言う通り、デバッグするにはバイト コードを確認できますが、それは私には魅力的に聞こえませんでした。

私の経験と調査に基づくと、多くの場合、リリース モードで誤ってコンパイルされ、無効なバイト コードを生成する trace ステートメントが存在することが原因です。したがって、「デバッグ」するには、「トレースを使用している場所を探します。問題のある関数でそれらをすべてコメントアウトして、問題が解決するかどうかを確認してください。」

私の場合、それは catch ブロックの最初の行として trace ステートメントでした:

catch (e:TypeError) {
    trace(e.getStackTrace()); //This line is the problem
    throw new Error("Unexpected type encountered");
}

ここで、この正確な問題を抱えている他の人を見つけました。

于 2012-02-13T11:48:50.183 に答える
2

このコードは、FlashBuilder4.5からリリース候補をコンパイルしたときに問題を引き起こしました

public function set configVO( value:PopupConfigVO ):void
        {trace("CHANGING")

トレースと中括弧の間にスペースを挿入することで解決しました

public function set configVO( value:PopupConfigVO ):void
        { trace("CHANGING")

お役に立てれば。

于 2012-01-24T11:16:21.473 に答える
2

同じ問題を探している人のために、switch ステートメントの「デフォルト」ケースの trace ステートメントが原因であることがわかりました。トレースをコメント アウトし、スタック アンダーフローが解決されました。

于 2012-09-07T05:03:40.517 に答える
2

このコードも、リリース モード (フラグ -debug=false) でのみスタック アンダーフローを引き起こします。

true && trace('123');

mxlmc flex SDK バージョン 4.5.0.20967、flashplayer バージョン 10.3.181.14 (Linux)。

コードに類似した式がないか確認してください。

于 2011-08-04T09:50:34.900 に答える
0

私はまったく同じ問題を抱えていましたが、私の場合、問題の原因は、クラスの最初のパッケージ宣言の直後に、コンパイラがそれを見つけることを期待していなかった場所のトレースステートメントでした:

package utils 
{

trace ("trace something here");

そのため、デバッグ モードでコンパイルすると問題が解決しました。

于 2013-07-02T05:27:16.073 に答える