2010-06-07 33 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; 
     } 
    } 
}