Linux下ActionScript 3的调试(Debug)方法

在前面的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中已经包含了。输入下面的命令进行安装:


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

・fdb的用法

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


MXMLC = /tmp/flex/bin/mxmlc
MFLAGS = -debug=true

TARGETS = hoge.swf

all: $(TARGETS)

clean:
$(RM) $(TARGETS)

.SUFFIXES: .as .swf
.as.swf:
$(MXMLC) $(MFLAGS) $<

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

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

・帮助是“h”

・重新打开程序是“c”

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

・察看确认源代码“list”

・察看变量“print 变量名”

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


・M-x gdb
・fdb hogo.swf

接下去就和前面一样了。

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

・利用trace()

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


package {
import flash.display.*;
public class debug extends Sprite {
public function debug () {
trace(“hello”);
}
}
}

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


$ flashplayer debug.swf
hello

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

・Flex SDK的runtimes下面

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

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

・和JavaScript联动的方法

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


package {
import flash.display.*;
import flash.external.ExternalInterface;

public class debug2 extends Sprite {
public function debug2 () {
ExternalInterface.call(‘alert’, “message”);
}
}
}

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

・利用firebug调试的方法

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

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


ExternalInterface.call(‘console.log’, “string is [%s]”, “abcde”);

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


package {
import flash.external.ExternalInterface;
import flash.utils.getQualifiedClassName;

public function log(… args):void {
var inspect:Function = function(arg:*, bracket:Boolean = true):String {
var className:String = getQualifiedClassName(arg);
var str:String;

switch(getQualifiedClassName(arg)) {
case ‘Array’:
var results:Array = [];
for (var i:uint = 0; i < arg.length; i++) { results.push(inspect(arg[i])); } if (bracket) { str = ‘[' + results.join(', ') + ']‘; } else { str = results.join(’, ‘); } break; case ‘int’: case ‘uint’: case ‘Number’: str = arg.toString(); break; case ‘String’: str = arg; break; default: str = ‘#<’ + className + ‘:’ + String(arg) + ‘>’;
}
return str;
}

var r:String = inspect(args, false);
trace(r)
ExternalInterface.call(’console.log’, r);
}
}

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

/home/tei/flex2/libs

然后就可以直接使用log()了。例如:


package {
import flash.display.*;
import flash.external.ExternalInterface;

public class hoge extends Sprite {
public function hoge () {
log(“hello”);
}
}
}

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


MXMLC = /tmp/flex/bin/mxmlc
MFLAGS =

TARGETS = hoge.swf

all: $(TARGETS)

clean:
$(RM) $(TARGETS)

.SUFFIXES: .as .swf
.as.swf:
$(MXMLC) $(MFLAGS) $< hoge.swf: log.as

Leave a Reply

Your email address will not be published. Required fields are marked *