2010-06-07 43 views
0

我有一個的Adobe Flash 10的程序,在某些情況下凍結,但只有在Flash播放器的發佈版本中運行時。使用調試版本,應用程序可以正常工作。調試版本只閃問題

什麼是調試此類問題的最佳方法?我考慮在我的電腦上安裝release player,並試圖設置某種非圖形化的輸出方式(我猜有些方法可以編寫日誌文件或類似的東西?),但是我看不出有什麼方法可以同時發佈和發佈反正安裝調試版本:(

編輯:好的,我成功地取代我的版本的Flash播放器的發佈版本,並沒有凍結的......所以我知道到目前爲止是什麼:

Flash:  Debug Release 
Vista 32: works works 
XP PRO 32: works* freeze 
  • 我給他們調試的球員,我不得不測試這個

嗯,看起來越來越不像我的代碼中的錯誤,更像是播放器中的錯​​誤(在所有情況下爲10.0.45.2)......至少id喜歡在它停下來的時候看到callstack。有沒有辦法做到這一點,而不要求他們安裝各種零件,例如通過讓閃存寫出一個log.txt或類似於函數的「跟蹤」功能,我可以在代碼中插入問題?

EDIT2:我只是給了SWF到另一個人用XP 32位,同樣的結果:(

EDIT3: 好,通過廣泛使用flash.external.ExternalInterface.call的( 「警報」,」 .. 「);我設法找到導致問題的確切線(我還改進了異常處理代碼,而不是凍結它告訴我有一個」未處理「的異常)。現在的問題是地球上閃爍的問題在某些機器上釋放播放器...

particles.push(p); 

在所述平臺上導致TypeError#1034。Particles is a Vecto河< Particle>,p是一個粒子。我的getQualifiedClassName測試,並得到:

的getQualifiedClassName(P)= ::粒子
的getQualifiedClassName(顆粒)= __AS3 __ VEC ::向量。 < ::粒子>

任何想法,爲什麼這是一個問題,以及如何使它工作?

EDIT4:

好,我似乎已經解決了這個。 Particle類只是一個簡單的內部類,它位於操作腳本文件中的包{...}後面,使用它。我把它移到它自己的文件(particle.as)中,並在我的包中成爲一個適當的公共類,並解決了問題。

也許它是一個閃存錯誤,或者我錯過了有關不使用內部類的向量或東西的備忘錄,但如果是這樣的話,我會預期的東西或其他(無論是在編譯時或調試運行時)禁止它明確地,例如「私人變量粒子:Vector。< Particle>;」中的一些錯誤線。如果我有機會,我想我會看看聯繫Adobe Flash團隊關於這個或什麼。

感謝您的幫助給調試技巧我的猜測是沿原線路問題:)

回答

1

時凍結髮生的情況來看更多,嘗試找出什麼問題的代碼可能是一些可能性,並使用De MonsterDebugger來檢查變量等

編輯: 我非常確定實際調用堆棧只有在調試版本的Flash Player/AIR中可用。不過,這可能是在調試播放器有用的在處理程序中跟蹤堆棧的按鈕,看看是否發現任何異常的地方:

var err:Error = new Error(「An Error」); 
trace(err.getStackTrace()); 

FYI的的getStackTrace方法只在調試播放器可用,所以沒有辦法將它寫入生產中的log.txt。

+0

嗯,我知道什麼時候在什麼樣的用戶與應用程序做的條款凍結,其當按下某個按鈕,但我不知道在哪裏的代碼凍結,看着我的代碼不能看到它應該做的任何理由(它所做的一切就是創建一些對象,設置一些變量並在刪除舊的Sprite時添加一個新的子對象),基本上所有的代碼都已經運行正常在應用程序中取得這麼大的進展...在代碼中甚至沒有任何循環可以讓它陷入...... – 2010-06-07 16:29:02

+0

我會看看那個調試器。它是否能夠成功地從Flash插件的發佈版本獲取信息,因爲o​​bv在我的機器上使用調試版本,我擁有Flash Builder調試器,但正如我所說的,它在那裏工作正常。 – 2010-06-07 16:30:37

+0

是的,它可以與插件的發行版一起使用,但不如FB調試器強大。它只能與暴露於初始化它的範圍的屬性一起使用。 – 2010-06-07 16:41:26

2

這是一個遠射,但是粒子是你點擊的對象?如果是這樣,然後在冒泡的錯誤階段捕捉事件,並推入event.target(假設它是一個粒子)可能會導致這個問題。

無論出現什麼問題,我都能幫助您進行調試。在SWF中創建一個僞跟蹤窗口的類,遠比對extinterfacing轉換爲javascript更好。我忘了是誰寫的,但我覺得它是Senocular。任何時候我都需要從最終用戶那裏獲取痕跡。

只需將它放入項目的默認包中,調用stage.addChild(new Output());然後跟蹤調用Output.trace(「A message」);

package { 
    import flash.display.Shape; 
    import flash.display.Sprite; 
    import flash.display.Stage; 
    import flash.display.GradientType; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.geom.Matrix; 
    import flash.text.TextField; 
    import flash.text.TextFieldType; 
    import flash.text.TextFormat; 
    import flash.text.TextFormatAlign; 
    import flash.text.TextFieldAutoSize; 

    /** 
    * Creates a pseudo Output panel in a publish 
    * swf for displaying trace statements. 
    * For the output panel to capture trace 
    * statements, you must use Output.trace() 
    * and add an instance to the stage: 
    * stage.addChild(new Output()); 
    * 
    */ 
    public class Output extends Sprite { 
     private var output_txt:TextField; 
     private var titleBar:Sprite; 
     private static var instance:Output; 
     private static var autoExpand:Boolean = false; 
     private static var maxLength:int = 1000; 

     public function Output(outputHeight:uint = 400){ 
      if (instance && instance.parent){ 
       instance.parent.removeChild(this); 
      } 

      instance = this; 
      addChild(newOutputField(outputHeight)); 
      addChild(newTitleBar()); 

      addEventListener(Event.ADDED, added); 
      addEventListener(Event.REMOVED, removed); 
     } 

     // public methods 
     public static function trace(str:*):void { 
      if (!instance) return; 
      instance.output_txt.appendText(str+"\n"); 
      if (instance.output_txt.length > maxLength) { 
       instance.output_txt.text = instance.output_txt.text.slice(-maxLength); 
      } 
      instance.output_txt.scrollV = instance.output_txt.maxScrollV; 
      if (autoExpand && !instance.output_txt.visible) instance.toggleCollapse(); 
     } 

     public static function clear():void { 
      if (!instance) return; 
      instance.output_txt.text = ""; 
     } 

     private function newOutputField(outputHeight:uint):TextField { 
      output_txt = new TextField(); 
      //output_txt.type = TextFieldType.INPUT; 
      output_txt.border = true; 
      output_txt.borderColor = 0; 
      output_txt.background = true; 
      output_txt.backgroundColor = 0xFFFFFF; 
      output_txt.height = outputHeight; 
      var format:TextFormat = output_txt.getTextFormat(); 
      format.font = "_sans"; 
      output_txt.setTextFormat(format); 
      output_txt.defaultTextFormat = format; 
      return output_txt; 
     } 

     private function newTitleBar():Sprite { 
      var barGraphics:Shape = new Shape(); 
      barGraphics.name = "bar"; 
      var colors:Array = new Array(0xE0E0F0, 0xB0C0D0, 0xE0E0F0); 
      var alphas:Array = new Array(1, 1, 1); 
      var ratios:Array = new Array(0, 50, 255); 
      var gradientMatrix:Matrix = new Matrix(); 
      gradientMatrix.createGradientBox(18, 18, Math.PI/2, 0, 0); 
      barGraphics.graphics.lineStyle(0); 
      barGraphics.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, gradientMatrix); 
      barGraphics.graphics.drawRect(0, 0, 18, 18); 

      var barLabel:TextField = new TextField(); 
      barLabel.autoSize = TextFieldAutoSize.LEFT; 
      barLabel.selectable = false; 
      barLabel.text = "Output"; 
      var format:TextFormat = barLabel.getTextFormat(); 
      format.font = "_sans"; 
      barLabel.setTextFormat(format); 

      titleBar = new Sprite(); 
      titleBar.addChild(barGraphics); 
      titleBar.addChild(barLabel); 
      return titleBar; 
     } 

     // Event handlers 
     private function added(evt:Event):void { 
      stage.addEventListener(Event.RESIZE, fitToStage); 
      titleBar.addEventListener(MouseEvent.CLICK, toggleCollapse); 
      fitToStage(); 
      toggleCollapse(); 
     } 

     private function removed(evt:Event):void { 
      stage.removeEventListener(Event.RESIZE, fitToStage); 
      titleBar.removeEventListener(MouseEvent.CLICK, toggleCollapse); 
     } 

     private function toggleCollapse(evt:Event = null):void { 
      if (!instance) return; 
      output_txt.visible = !output_txt.visible; 
      fitToStage(evt); 
     } 

     private function fitToStage(evt:Event = null):void { 
      if (!stage) return; 
      output_txt.width = stage.stageWidth; 
      output_txt.y = stage.stageHeight - output_txt.height; 
      titleBar.y = (output_txt.visible) ? output_txt.y - titleBar.height : stage.stageHeight - titleBar.height; 
      titleBar.getChildByName("bar").width = stage.stageWidth; 
     } 
    } 
}