Gewusst wie: Debuggen eine runtime-stack-Unterlauf-Fehler?
Ich bin wirklich kämpfen, um Sie zu lösen, einen stack-Unterlauf, die ich immer bin. Die traceback-ich bekomme zur Laufzeit:
VerifyError: Error #1024: Stack-Unterlauf aufgetreten ist. bei flash.events::EventDispatcher/dispatchEventFunction() bei flash.events::EventDispatcher/dispatchEvent() bei flash.net::URLLoader/onComplete()
Dies ist besonders schwierig zu Debuggen, weil wenn ich im debug-Modus ausgeführt, es passiert nicht bei allen. Es geschieht nur, wenn kompiliert, wie ein release.
Hat jemand irgendwelche Tipps, wie man eine debug-Stack-Unterlauf? Eine saubere Erklärung, was das bedeutet für Flash?
Falls es hilft, dieser Fehler wird auftreten, wenn ich auf eine Schaltfläche klicken, deren handler macht einen RPC-Aufruf, der mit einem URLLoader -, ein AsyncToken, und ruft dann die Menge der AsyncResponder Instanzen im Zusammenhang mit der AsyncToken. Mit einigen server-Protokollierung sowie einige logging-gehackt in die swf-Datei, ich weiß, dass Sie die UrlLoader-erfolgreich tun und BEKOMMEN ' Ing ein crossdomain.xml Datei ist korrekt, die Verarbeitung (sprich: wenn ich Wrack es, bekomme ich eine Sicherheits-Fehler) und ist auch mit dem erfolgreichen Abschluss der "Last" anfordern (der server sendet die Daten). Der Unterlauf scheint passiert zu sein in der Veranstaltung.KOMPLETT zu hören/Bearbeitung (wie, natürlich, impliziert durch die traceback-als auch).
mxmlc verwendet = aus flex_sdk_4.5.0.20967
Beispiel player (ich habe versucht ein paar) = 10.2.153.1
UPDATE: Mein problem ist gelöst... aber ich lasse die Frage-ist da würde ich gerne wissen, wie man im Allgemeinen debug-so ein problem ist, anstatt nur immer meine spezifische Lösung.
In meinem code hatte ich die folgende Anwendung der definition:
<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();">
Beachten Sie, dass der code ist/war an der initialize
Veranstaltung.
InitData() und der entsprechenden Definitionen sind/waren:
import classes.RpcServerProxy;
public var SP:RpcServerProxy;
public function InitData():void {
SP = new RpcServerProxy("http://192.168.1.102:1234");
}
Wenn ich wechselte die InitData () - Aufruf auf die onCompletion
Veranstaltung statt initialize
(Dank J_A_X!), das problem verschwindet ganz. Was anscheinend passiert ist, war, dass die Event.KOMPLETTE event-handler (onComplete in dem stack-trace) wurde mit dem global SP-Objekt. Etwas über die release (vs debug) Zusammenstellung gewesen sein muss, Auswirkungen auf das Start-timing der SP-Initialisierung der Variablen. Verschieben der handler später die onCompletion
Fall gelöst alle Probleme.
Wie gesagt, ich würde noch gerne wissen, mit welchen tricks/Werkzeuge für debugging-Initialisierung Probleme wie diese.
UPDATE 2:
applicationComplete
zu sein scheint, eine noch bessere Veranstaltung als creationComplete
zu setzen Initialisierung der Anwendung code. Sehen dieser blog-Eintrag für einige Erklärung, und und dieses video (um 4:25) durch einen Adobe Tech-Evangelist für ein Beispiel eines einfachen "starten der Anwendung" Daten-Initialisierung.
- Können Sie nach dem code für die "komplette" event-handler?
- Fujiwara: Siehe mein update oben...
- Ich habe das gleiche problem wie du, aber auf einer anderen Stelle in meinem Programm. Die Umschaltung der Reihenfolge der Aufruf einige Funktionen das problem behoben. Das ist beängstigend.
- Ich habe gerade das problem aufgetreten ist. Wie kommt dieses problem immer noch auftreten in 2016?! 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stack-Unterlauf im Grunde bedeutet, dass der compiler Durcheinander.
Können Sie SWFWire Inspektor zu schauen, den bytecode der event-handler, wenn Sie genau wissen wollen, wie es Durcheinander. Sie können auch SWFWire Debugger zu sehen, welche Methoden aufgerufen wurden, aber in diesem Fall, Sie wüsste schon, wo es passiert war.
Wenn Sie nach der gebrochenen swf, kann ich Ihnen mehr info.
Ich entledigte dieser Fehler durch das hinzufügen von compiler-argument:
-weglassen-trace-Anweisungen=false
Sean ist richtig, dass zu Debuggen, können Sie die byte-code, aber das Klang nicht attraktiv für mich.
Basierend auf meiner Erfahrung und Forschung, ist es oft aufgrund der Anwesenheit von eine trace-Anweisung, falsch kompiliert wird sich im release-Modus und erzeugt ungültige byte-code. Also, ich würde sagen, auf "debug" it " - Look für Orte, an denen Sie mit Hilfe von trace. Versuchen Sie, kommentieren Sie Sie alle aus in die problematische Funktion und sehen, ob das Problem verschwindet."
In meinem Fall war es eine trace-Anweisung als erste Zeile in einem catch-block:
Fand ich jemand anderen mit genau diesem Problem hier.
Dieser code führt auch zu stack-Unterlauf nur im release-Modus (flag -debug=false):
mxlmc flex sdk-version, 4.5.0.20967, flashplayer version 10.3.181.14 (linux).
Überprüfen Sie Ihren code für ähnliche Ausdrücke.
Dieser code verursacht mir Probleme, wenn ich einen release-Kandidaten von flash builder 4.5
Gelöst, indem ein Raum zwischen dem trace und der geschweiften Klammer
Hoffe, das hilft.
Menschen, die sich für das gleiche problem, nur ich habe diese verursacht, indem Sie eine trace-Anweisung in der 'default' - Fall einer switch-Anweisung. Kommentiert aus der Spur, stack-Unterlauf aufgelöst.
Interessant... ich war immer dieser Fehler mit einer SWF-Datei, die ich aus dem Netz gezogen, ein Away3D basierende Grafik-demo. Zu der Zeit war ich laufen, diese auf die Tamarin VM, anstatt die eigentliche Flash - /AIR-Laufzeitumgebungen, so könnte der stick einen Haltepunkt auf der "verifyFailed(kStackUnderflowError)" Linie und sehen, was passiert war.
Den -Dverbose Flagge auch geholfen, den Schuldigen finden:
Suchen und am ABC mit SWFInvestigator, fand ich dies:
Also es ist eine naheliegende Frage, wo die 'Spur' ist entfernt worden, aber der compiler hat ein 'pop' gibt: ich hätte nicht gedacht, dass diese nötig war, wie ein trace-Aufruf sollte vermutlich wurden Sie über 'callpropvoid'?
Ganz, warum dies nicht fail on AIR/Flash-ich weiß nicht..
Trotzdem: sieht für mich wie ein ASC problem mit dem compiler ich.e vielleicht eines der ActionScript3-Compiler hatte einen Fehler mit dieser - daher auch die workarounds, die erwähnt wurden, so weit.
Es ist ganz einfach, und es hat nichts zu tun mit Leerzeichen vor oder nach den Klammern, trace-Befehle oder sonst was ist: es ist nur 1 wirklich einfaches Ding:
NICHT LOOP LEER!
Bedeutung, während die Entwicklung, die wir alle //Kommentar einige Zeilen, manchmal, und wenn, dass die Ergebnisse in
den compiler bekommt :
ist und dass meine guten Freunde, ist etwas, was der compiler nicht mag!
so, KEINE leeren Schleifen, und Sie sind auf Ihrem Weg wieder...
Happy hunting,
P.
for (var key:String in foo)
und der stack-trace zeigte auf eine andere PositionIch hatte genau das gleiche problem, aber in meinem Fall die Ursache des Problems war eine trace-Anweisung in einem Ort, wo der compiler hatte nicht erwartet, ihn zu finden, direkt nach einer package-Deklaration am Anfang der Klasse:
... Und das ist der Grund, warum das kompilieren im debug-Modus beseitigt das problem.