May 27

在前面的Linux上用ActionScript 3(Adobe FLEX 3.0 SDK)开发Adobe Flash应用(英文版本)中,我们尝试着在Linux的环境下,利用Adobe Flex 3.0 SDK成功的搭建好了开发环境并且让我们的“hello actionscript 3″ 得以运行了。相对于Windows下的程序员来说,Linux程序员的调试(Debug)显得就要复杂一些。而像仅仅利用Adobe Flex 3.0 SDK的用户来说,就显得更加麻烦一些了。不过麻烦并不表示功能上它就比较弱,相反的当你习惯了Linux的gdb(Flex 3.0 SDK的fdb)之后,你会发现原来在Linux下你可以按照你的思维来调试程序,而不是像Windows下那样,你的思维需要跟着调试的结果走。不那么废话了,还是让我们赶紧尝试着Linux下的Debug之旅吧。


Linux下的Debug方法:

・使用debugger

・最为原始的print方法

我们大体上可以划分为上面的两种。接下去具体就每一种方法进行说明。

 ・使用debugger

所谓的利用debugger,也就是利用Adobe Flex 3.0 SDK中附带的fdb这个工具来调试我们的程序的方法。

・安装

要使用fdb,一个必要的条件就是需要系统中安装了flashplayer。flashplayer在前面Linux上用ActionScript 3(Adobe FLEX 3.0 SDK)开发Adobe Flash应用(英文版本)中我们下载的Adobe Flex 3.0 SDK中已经包含了。输入下面的命令进行安装:

  1. $ tar xvfz flex/runtimes/player/lnx/flashplayer.tar.gz
  2. $ sudo cp flashplayer /usr/bin

・fdb的用法

要想利用fdb对swf文件进行调试(debug),需要swf文件中包含调试所需要的信息。这需要我们用mxmlc编译的时候,将-debug=true这个选项加上进行编译。Makefile可以写成下面这样:

  1. MXMLC = /tmp/flex/bin/mxmlc
  2. MFLAGS = -debug=true
  3.  
  4. TARGETS  = hoge.swf
  5.  
  6. all: $(TARGETS)
  7.  
  8. clean:
  9.         $(RM) $(TARGETS)
  10.  
  11. .SUFFIXES:      .as .swf
  12. .as.swf:
  13.         $(MXMLC) $(MFLAGS) $<

这样编译出来的swf文件就包含了调试所需要的信息了。直接输入下面的命令,就可以打开swf文件进行调试了。

接下去的操作基本上和gdb一样了。

・帮助是“h”

・重新打开程序是“c”

・放置断点(BreakPoint)是“b 函数名”

・察看确认源代码“list”

・察看变量“print 变量名”

另外,我们也可以从emacs启动fdb进行调试,具体的操作是:

  1. M-x gdb
  2. fdb hogo.swf

接下去就和前面一样了。

・使用print输出进行调试的方法

・利用trace()

ActionScript中本身用来输出调试信息的函数就是trace()。用法像下面这样:

  1. package {
  2.     import flash.display.*;
  3.     public class debug extends Sprite {
  4.         public function debug () {
  5.             trace("hello");
  6.         }
  7.     }
  8. }

上面的代码在flashplayer中执行的话,应该是这样的:

  1. $ flashplayer debug.swf
  2. hello

也就是输出hello。这里比较重要的不得不说明的是,trace()仅仅针对debugger版的的player或者plugin有效。一般的用户使用的版本以及开发者使用版本分别可以在:

・Flex SDK的runtimes下面

http://www.adobe.com/support/flashplayer/downloads.html

下载到,不过需要安装专门的版本,怎么说都还是比较麻烦了点。

・和JavaScript联动的方法

除了上面的trace()以外,也有从swf文件中,客户端浏览器利用JavaScript函数调用输出的方法,代码可以写成下面这样:

  1. package {
  2.     import flash.display.*;
  3.     import flash.external.ExternalInterface;
  4.  
  5.     public class debug2 extends Sprite {
  6.         public function debug2 () {
  7.             ExternalInterface.call('alert', "message");
  8.         }
  9.     }
  10. }

这样实际上就是调用JavaScript中的alert函数,以对话框的形式将“message”显示出来。

・利用firebug调试的方法

既然可以利用JavaScript调试,那么也就理所当然的可以使用firebug进行调试了。

具体的用法大家直接参照firebug的关于JavaScript调试的相关资料就可以了。特别需要说明的是,firebug中的调试的话,除了上面提到的,还可以使用log()函数像printf那样进行格式化输出。例如:

  1. ExternalInterface.call('console.log', "string is [%s]""abcde");

下面的代码就是根据这个基础写出来的比较具有使用价值的部分:

  1. package {
  2.   import flash.external.ExternalInterface;
  3.   import flash.utils.getQualifiedClassName;
  4.  
  5.   public function log(... args):void {
  6.     var inspect:Function = function(arg:*, bracket:Boolean = true):String {
  7.         var className:String = getQualifiedClassName(arg);
  8.         var str:String;
  9.  
  10.         switch(getQualifiedClassName(arg)) {
  11.             case 'Array':
  12.               var results:Array = [];
  13.               for (var i:uint = 0; i < arg.length; i++) {
  14.                   results.push(inspect(arg[i]));
  15.               }
  16.               if (bracket) {
  17.                 str = ‘[' + results.join(', ') + ']‘;
  18.               } else {
  19.                 str = results.join(’, ‘);
  20.               }
  21.               break;
  22.             caseint’:
  23.             caseuint’:
  24.             caseNumber’:
  25.               str = arg.toString();
  26.               break;
  27.             caseString’:
  28.               str = arg;
  29.               break;
  30.             default:
  31.               str = ‘#<’ + className + ‘:’ + String(arg) + ‘>’;
  32.         }
  33.         return str;
  34.     }
  35.  
  36.     var r:String = inspect(args, false);
  37.     trace(r)
  38.     ExternalInterface.call(console.log’, r);
  39.   }
  40. }

保存为“log.as”,在flex-config.xml的source-path中添加:

  1. <source-path>
  2.         <path-element>/home/tei/flex2/libs</path-element>
  3. </source-path>
然后就可以直接使用log()了。例如:
  1. package {
  2.     import flash.display.*;
  3.     import flash.external.ExternalInterface;
  4.  
  5.     public class hoge extends Sprite {
  6.         public function hoge () {
  7.             log("hello");
  8.         }
  9.     }
  10. }

如果log.as放在同一个目录下当然也可以使用,Makefile可以写成这样:

  1. MXMLC = /tmp/flex/bin/mxmlc
  2. MFLAGS =
  3.  
  4. TARGETS  = hoge.swf
  5.  
  6. all: $(TARGETS)
  7.  
  8. clean:
  9.         $(RM) $(TARGETS)
  10.  
  11. .SUFFIXES:      .as .swf
  12. .as.swf:
  13.         $(MXMLC) $(MFLAGS) $<
  14.  
  15. hoge.swf: log.as

written by Minidxer  |  tags: , , , ,

Related Post

Leave a Reply