一种在Flash中加入打印日志功能的方法及装置与流程

文档序号:11230139阅读:322来源:国知局
一种在Flash中加入打印日志功能的方法及装置与流程

本发明涉及视频流播放技术领域,特别涉及一种在flash中加入打印日志功能的方法及装置。



背景技术:

目前,flash被广泛的用于网页设计和网页动画制作及网页视频播放等。大多数的视频网站包括直播网站都采用flash做为其视频播放器,并且大多数的网页游戏也会使用flash来开发,flash的开发是使用actionscript脚本语言来开发,最终生成的可以运行的文件是swf(shockwaveflash)文件。

现有技术中,对于已经发布的swf文件,目前是没有办法在其中打印日志来定位问题的,那么如果要想打印日志的话则需要重新编译一个带打印日志功能的swf来定位问题。



技术实现要素:

本发明实施例提供了一种在flash中加入打印日志功能的方法及装置,方便开发者获取flash中变量的值,或者在某段代码中加入日志来判断当前函数执行情况,同时在flash文件出现问题时,可以快速定位问题,提高文件处理效率。

第一方面,本申请提供一种在flash中加入打印日志功能的方法,该方法包括:

获取需要加入打印日志功能的flash文件;

查找所述flash文件源代码中的指定函数,所述指定函数为所述flash文件源代码中预先确定的需要加入打印日志功能的函数;

在所述指定函数中加入打印日志功能的代码;

将修改后的flash文件保存为新的flash文件。

进一步的,所述在所述指定函数中加入打印日志功能的代码的步骤,包括:

在所述指定函数中加入打印日志的代码。

进一步的,所述在所述指定函数中加入打印日志功能的代码的步骤,还包括:

在所述指定函数中加入打印局部变量的代码。

进一步的,所述在所述指定函数中加入打印日志功能的代码的步骤,还包括:

在所述指定函数中加入打印当前函数的调用堆栈信息的代码。

进一步的,所述在所述指定函数中加入打印当前函数的调用堆栈信息的代码的步骤,具体包括:

在所述指定函数中加入调用actionscript中提供的error组件的代码,所述error组件中的getstacktrace接口函数用于获取所述指定函数的所有调用堆栈信息。

第二方面,本申请提供一种在flash中加入打印日志功能的装置,该装置包括:

获取单元,用于获取需要加入打印日志功能的flash文件;

查找单元,用于查找所述flash文件源代码中的指定函数,所述指定函数为所述flash文件源代码中预先确定的需要加入打印日志功能的函数;

添加单元,用于在所述指定函数中加入打印日志功能的代码;

保存单元,用于将修改后的flash文件保存为新的flash文件。

进一步的,所述添加单元具体用于:

在所述指定函数中加入打印日志的代码。

进一步的,所述添加单元具体还用于:

在所述指定函数中加入打印局部变量的代码。

进一步的,所述添加单元具体还用于:

在所述指定函数中加入打印当前函数的调用堆栈信息的代码。

进一步的,所述添加单元具体用于:

在所述指定函数中加入调用actionscript中提供的error组件的代码,所述error组件中的getstacktrace接口函数用于获取所述指定函数的所有调用堆栈信息。

本发明实施例中通过获取需要加入打印日志功能的flash文件,查找flash文件的源代码中需要加入打印日志功能的指定函数,在指定函数中加入打印日志的功能代码,将修改后的flash文件保存为新的flash文件。本发明实施例中在已发表的flash文件的源代码中加入打印日志功能,方便开发者获取flash中在某个需要的函数中加入打印日志功能来打印日志以判断当前函数执行情况,同时在flash文件出现问题时,可以快速定位问题,提高文件处理效率。

附图说明

图1是本发明实施例中在flash中加入打印日志功能的方法的一个实施例示意图;

图2是本发明实施例中在flash中加入打印日志功能的方法的另一个实施例示意图;

图3是本发明实施例中在flash中加入打印日志功能的方法的另一个实施例示意图;

图4是本发明实施例中在flash中加入打印日志功能的方法的另一个实施例示意图;

图5是本发明实施例中在flash中加入打印日志功能的装置的一个实施例示意图。

具体实施方式

本发明实施例提供了一种在flash中加入打印日志功能的方法及装置,方便开发者获取flash中变量的值,或者在某段代码中加入日志来判断当前函数执行情况,同时在flash文件出现问题时,可以快速定位问题,提高文件处理效率。

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

下面首先介绍本发明实施例中在flash中加入打印日志功能的方法的实施例,该在flash中加入打印日志功能的方法应用于在flash中加入打印日志功能的装置,该装置可以应用于服务器中。

请参阅图1,本发明实施例中在flash中加入打印日志功能的方法的一个实施例包括:

s1、获取需要加入打印日志功能的flash文件;

其中,flash文件可以是swf文件。

s2、查找flash文件源代码中的指定函数;

其中,该指定函数为flash文件源代码中预先确定的需要加入打印日志功能的函数。例如swf文件中的actionscript代码中的trace函数。

该步骤中可以利用反编译工具查找flash文件的源代码中需要加入打印日志功能的指定函数,以flash文件为swf文件为例,由于swf文件的格式以及abc文件的格式都是公开的,并且其源代码也是开源的。所以有很多免费的工具都可以对swf文件进行反编译,并且展示出swf文件中包含有哪些包名,哪些类名,哪些函数名等等。同时反编译工具也可以看到其对应的abc字节码(actionscript代码将被编译成flashplayer运行时可以理解的actionscriptbytecode,简称为abc字节码),通过包名和函数名则可以找到需要加入日志的具体地方。通过该步骤s2就可以实现查找出需要加入日志功能的指定函数的位置。

s3、在指定函数中加入打印日志的功能代码;

s4、将修改后的flash文件保存为新的flash文件。

本发明实施例中通过获取需要加入打印日志功能的flash文件,查找flash文件的源代码中需要加入打印日志功能的指定函数,在指定函数中加入打印日志的功能代码,将修改后的flash文件保存为新的flash文件。本发明实施例中在已发表的flash文件的源代码中加入打印日志功能,方便开发者获取flash中在某个需要的函数中加入打印日志功能来打印日志以判断当前函数执行情况,同时在flash文件出现问题时,可以快速定位问题,提高文件处理效率。

本发明实施例中,以flash文件为swf文件为例,swf文件的组成是由一些标签、媒体资源及abc字节码组成。其中字节码则对应的是actionscript编译后的代码文件。abc字节码是一种虚拟机的字节码,其是使用avm2(actionscriptvirtualmachine2)虚拟引擎来执行。那么如果想要在最终编译后的swf文件中加入打印日志的功能以获取某个变量的值,或者在某段代码中加入打印日志的功能来打印日志以判断当前函数是否有执行,则可以通过修改swf文件中的abc字节码来实现加入打印日志的功能。avm2引擎是基于堆栈的一种虚拟机引擎,所以其所有的运算存取变量都是基于堆栈来进行的。如果需要获取中间的变量值则可以在abc字节码中插入堆栈操作来获取变量的值并进行打印。

在步骤s2中查找到flash文件的源代码中需要加入打印日志功能的指定函数后,通过步骤s3可以在指定函数中加入打印日志功能的代码。其中,如图2所示,步骤s3可以具体包括:

s31、在指定函数中加入打印日志的代码。

仍以上述描述的flash文件为swf文件为例,对于swf文件中的actionscript代码文件,日志打印的实现是调用其中的trace函数,该函数有一个参数就是一个字符串用于将其输出出来进行显示。

那么要想实现在指定函数中加入打印日志的代码,在需要打印日志的地方插入trace函数的调用即可。而对于abc代码中插入调用trace功能的代码需要使用编写的abc的代码来加入,具体则对应于avm引擎的代码指令,具体需要插入的代码实现如下:

findpropstrictqname(packagenamespace(""),"trace")

pushstring"loghere"

callpropvoidqname(packagenamespace(""),"trace")1

上述3条abc字节码则实现了在当前位置调用trace功能来打印一条“loghere”的日志。其中,对于第一条指令findpropstrict则表示从当前的作用域中查找一个函数名trace。后续的qname(packagenamespace(""),"trace")则表示trace所在的包名的组合,其中包名是空。然后调用pushstring"loghere"来往当前的堆栈中字符串“loghere”。最后则通过指令callpropvoid来调用trace来将当前堆栈的字符串打印出来。

同样的方法也可以在其他需要加入打印日志功能的地方加入,加入打印日志功能后通过观察打印日志则比较方便的可以定位哪些函数有调用以及通过查看打印日志来查看函数调用的顺序。至此,通过这个步骤就实现了在指定函数中加入一段打印日志的代码。

进一步的,如图3所示,步骤s3具体还可以包括:

s32、在指定函数中加入打印局部变量的代码。

对于定位问题或者日志输出来说,仅仅打印一条日志不足以满足所有的需求,对此本发明实施例中也进一步提供了可以将运行到当前环境时的局部变量的值打印出来的功能,从而可以比较方便的定位中间计算的结果是否满足预期,该功能可以在指定函数中加入打印局部变量的代码来实现,具体需要插入的代码实现如下:

findpropstrictqname(packagenamespace(""),"trace")

getpropertyqname(packagenamespace(""),"url")

callpropvoidqname(packagenamespace(""),"trace")1

具体区别于步骤s31的是第二条指令getproperty,该指令是用于获取一个名称为url的值,并将其存储在堆栈顶。然后通过指令callpropvoid来调用trace来打印该变量的值。至此,通过这个步骤就可以实现在指定函数中加入打印一个局部变量的值的功能。

进一步的,如图4所示,步骤s3具体还可以包括:

s33、在指定函数中加入打印当前函数的调用堆栈信息的代码。

在步骤s32中加入了打印一个局部变量的代码,但是有时候更希望能够获取当前函数的调用堆栈信息,以便于从堆栈信息中查找该函数是从哪里调用过来的。有了堆栈信息则便于更好的定位问题。而在actionscript中提供了一个error组件,其中有一个接口函数getstacktrace能够获取到当前的函数所有调用堆栈信息。具体需要插入的代码实现如下:

findpropstrictqname(packagenamespace(""),"trace")

findpropstrictqname(packagenamespace(""),"error")

constructpropqname(packagenamespace(""),"error")0

callpropertyqname(packagenamespace(""),"getstacktrace")0

callpropvoidqname(packagenamespace(""),"trace")1

具体的,该步骤s33可以进一步包括:

在指定函数中加入调用actionscript中提供的error组件的代码,该error组件中的getstacktrace接口函数用于获取所述指定函数的所有调用堆栈信息。

对于此步骤s33与上述步骤s31、步骤s32的区别是,调用了指令findpropstrict来寻找组件error。然后调用了指令constructprop来创建一个error对象,然后通过指令callproperty来调用error对象的getstacktrace方法来获取堆栈信息,最后则通过指令callpropvoid来调用trace(指定函数)将堆栈信息打印出来。

至此,通过这个步骤就实现了在指定函数中插入一段获取当前函数调用堆栈信息并将信息打印出来的功能。

对于步骤s4,仍以flash文件为swf文件为例,对于通过swf的反编译工具修改了指定函数后,可以通过该工具将修改的内容进行保存成一个新的swf文件,则通过运行最新的swf文件就会包含打印之前加入的打印日志的功能代码。

下面介绍本发明实施例中在flash中加入打印日志功能的装置的实施例。

请参阅图5,为本发明实施例中在flash中加入打印日志功能的装置的一个实施例示意图,该在flash中加入打印日志功能的装置包括:

获取单元501,用于获取需要加入打印日志功能的flash文件;

查找单元502,用于查找所述flash文件源代码中的指定函数,所述指定函数为所述flash文件源代码中预先确定的需要加入打印日志功能的函数;

添加单元503,用于在所述指定函数中加入打印日志功能的代码;

保存单元504,用于将修改后的flash文件保存为新的flash文件。

进一步的,所述添加单元503具体用于:

在所述指定函数中加入打印日志的代码。

进一步的,所述添加单元503具体还用于:

在所述指定函数中加入打印局部变量的代码。

进一步的,所述添加单元503具体还用于:

在所述指定函数中加入打印当前函数的调用堆栈信息的代码。

进一步的,所述添加单元503具体用于:

在所述指定函数中加入调用actionscript中提供的error组件的代码,所述error组件中的getstacktrace接口函数用于获取所述指定函数的所有调用堆栈信息。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1