在前面的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中添加:
- <source-path>
- <path-element>/home/tei/flex2/libs</path-element>
- </source-path>
然后就可以直接使用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
