本發(fā)明涉及視頻流播放技術領域,特別涉及一種在flash中加入打印日志功能的方法及裝置。
背景技術:
目前,flash被廣泛的用于網(wǎng)頁設計和網(wǎng)頁動畫制作及網(wǎng)頁視頻播放等。大多數(shù)的視頻網(wǎng)站包括直播網(wǎng)站都采用flash做為其視頻播放器,并且大多數(shù)的網(wǎng)頁游戲也會使用flash來開發(fā),flash的開發(fā)是使用actionscript腳本語言來開發(fā),最終生成的可以運行的文件是swf(shockwaveflash)文件。
現(xiàn)有技術中,對于已經(jīng)發(fā)布的swf文件,目前是沒有辦法在其中打印日志來定位問題的,那么如果要想打印日志的話則需要重新編譯一個帶打印日志功能的swf來定位問題。
技術實現(xiàn)要素:
本發(fā)明實施例提供了一種在flash中加入打印日志功能的方法及裝置,方便開發(fā)者獲取flash中變量的值,或者在某段代碼中加入日志來判斷當前函數(shù)執(zhí)行情況,同時在flash文件出現(xiàn)問題時,可以快速定位問題,提高文件處理效率。
第一方面,本申請?zhí)峁┮环N在flash中加入打印日志功能的方法,該方法包括:
獲取需要加入打印日志功能的flash文件;
查找所述flash文件源代碼中的指定函數(shù),所述指定函數(shù)為所述flash文件源代碼中預先確定的需要加入打印日志功能的函數(shù);
在所述指定函數(shù)中加入打印日志功能的代碼;
將修改后的flash文件保存為新的flash文件。
進一步的,所述在所述指定函數(shù)中加入打印日志功能的代碼的步驟,包括:
在所述指定函數(shù)中加入打印日志的代碼。
進一步的,所述在所述指定函數(shù)中加入打印日志功能的代碼的步驟,還包括:
在所述指定函數(shù)中加入打印局部變量的代碼。
進一步的,所述在所述指定函數(shù)中加入打印日志功能的代碼的步驟,還包括:
在所述指定函數(shù)中加入打印當前函數(shù)的調(diào)用堆棧信息的代碼。
進一步的,所述在所述指定函數(shù)中加入打印當前函數(shù)的調(diào)用堆棧信息的代碼的步驟,具體包括:
在所述指定函數(shù)中加入調(diào)用actionscript中提供的error組件的代碼,所述error組件中的getstacktrace接口函數(shù)用于獲取所述指定函數(shù)的所有調(diào)用堆棧信息。
第二方面,本申請?zhí)峁┮环N在flash中加入打印日志功能的裝置,該裝置包括:
獲取單元,用于獲取需要加入打印日志功能的flash文件;
查找單元,用于查找所述flash文件源代碼中的指定函數(shù),所述指定函數(shù)為所述flash文件源代碼中預先確定的需要加入打印日志功能的函數(shù);
添加單元,用于在所述指定函數(shù)中加入打印日志功能的代碼;
保存單元,用于將修改后的flash文件保存為新的flash文件。
進一步的,所述添加單元具體用于:
在所述指定函數(shù)中加入打印日志的代碼。
進一步的,所述添加單元具體還用于:
在所述指定函數(shù)中加入打印局部變量的代碼。
進一步的,所述添加單元具體還用于:
在所述指定函數(shù)中加入打印當前函數(shù)的調(diào)用堆棧信息的代碼。
進一步的,所述添加單元具體用于:
在所述指定函數(shù)中加入調(diào)用actionscript中提供的error組件的代碼,所述error組件中的getstacktrace接口函數(shù)用于獲取所述指定函數(shù)的所有調(diào)用堆棧信息。
本發(fā)明實施例中通過獲取需要加入打印日志功能的flash文件,查找flash文件的源代碼中需要加入打印日志功能的指定函數(shù),在指定函數(shù)中加入打印日志的功能代碼,將修改后的flash文件保存為新的flash文件。本發(fā)明實施例中在已發(fā)表的flash文件的源代碼中加入打印日志功能,方便開發(fā)者獲取flash中在某個需要的函數(shù)中加入打印日志功能來打印日志以判斷當前函數(shù)執(zhí)行情況,同時在flash文件出現(xiàn)問題時,可以快速定位問題,提高文件處理效率。
附圖說明
圖1是本發(fā)明實施例中在flash中加入打印日志功能的方法的一個實施例示意圖;
圖2是本發(fā)明實施例中在flash中加入打印日志功能的方法的另一個實施例示意圖;
圖3是本發(fā)明實施例中在flash中加入打印日志功能的方法的另一個實施例示意圖;
圖4是本發(fā)明實施例中在flash中加入打印日志功能的方法的另一個實施例示意圖;
圖5是本發(fā)明實施例中在flash中加入打印日志功能的裝置的一個實施例示意圖。
具體實施方式
本發(fā)明實施例提供了一種在flash中加入打印日志功能的方法及裝置,方便開發(fā)者獲取flash中變量的值,或者在某段代碼中加入日志來判斷當前函數(shù)執(zhí)行情況,同時在flash文件出現(xiàn)問題時,可以快速定位問題,提高文件處理效率。
為了使本技術領域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分的實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領域普通技術人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應當屬于本發(fā)明保護的范圍。
本發(fā)明的說明書和權利要求書及上述附圖中的術語“第一”、“第二”等(如果存在)是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應該理解這樣使用的數(shù)據(jù)在適當情況下可以互換,以便這里描述的實施例能夠以除了在這里圖示或描述的內(nèi)容以外的順序?qū)嵤4送?,術語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設備固有的其它步驟或單元。
下面首先介紹本發(fā)明實施例中在flash中加入打印日志功能的方法的實施例,該在flash中加入打印日志功能的方法應用于在flash中加入打印日志功能的裝置,該裝置可以應用于服務器中。
請參閱圖1,本發(fā)明實施例中在flash中加入打印日志功能的方法的一個實施例包括:
s1、獲取需要加入打印日志功能的flash文件;
其中,flash文件可以是swf文件。
s2、查找flash文件源代碼中的指定函數(shù);
其中,該指定函數(shù)為flash文件源代碼中預先確定的需要加入打印日志功能的函數(shù)。例如swf文件中的actionscript代碼中的trace函數(shù)。
該步驟中可以利用反編譯工具查找flash文件的源代碼中需要加入打印日志功能的指定函數(shù),以flash文件為swf文件為例,由于swf文件的格式以及abc文件的格式都是公開的,并且其源代碼也是開源的。所以有很多免費的工具都可以對swf文件進行反編譯,并且展示出swf文件中包含有哪些包名,哪些類名,哪些函數(shù)名等等。同時反編譯工具也可以看到其對應的abc字節(jié)碼(actionscript代碼將被編譯成flashplayer運行時可以理解的actionscriptbytecode,簡稱為abc字節(jié)碼),通過包名和函數(shù)名則可以找到需要加入日志的具體地方。通過該步驟s2就可以實現(xiàn)查找出需要加入日志功能的指定函數(shù)的位置。
s3、在指定函數(shù)中加入打印日志的功能代碼;
s4、將修改后的flash文件保存為新的flash文件。
本發(fā)明實施例中通過獲取需要加入打印日志功能的flash文件,查找flash文件的源代碼中需要加入打印日志功能的指定函數(shù),在指定函數(shù)中加入打印日志的功能代碼,將修改后的flash文件保存為新的flash文件。本發(fā)明實施例中在已發(fā)表的flash文件的源代碼中加入打印日志功能,方便開發(fā)者獲取flash中在某個需要的函數(shù)中加入打印日志功能來打印日志以判斷當前函數(shù)執(zhí)行情況,同時在flash文件出現(xiàn)問題時,可以快速定位問題,提高文件處理效率。
本發(fā)明實施例中,以flash文件為swf文件為例,swf文件的組成是由一些標簽、媒體資源及abc字節(jié)碼組成。其中字節(jié)碼則對應的是actionscript編譯后的代碼文件。abc字節(jié)碼是一種虛擬機的字節(jié)碼,其是使用avm2(actionscriptvirtualmachine2)虛擬引擎來執(zhí)行。那么如果想要在最終編譯后的swf文件中加入打印日志的功能以獲取某個變量的值,或者在某段代碼中加入打印日志的功能來打印日志以判斷當前函數(shù)是否有執(zhí)行,則可以通過修改swf文件中的abc字節(jié)碼來實現(xiàn)加入打印日志的功能。avm2引擎是基于堆棧的一種虛擬機引擎,所以其所有的運算存取變量都是基于堆棧來進行的。如果需要獲取中間的變量值則可以在abc字節(jié)碼中插入堆棧操作來獲取變量的值并進行打印。
在步驟s2中查找到flash文件的源代碼中需要加入打印日志功能的指定函數(shù)后,通過步驟s3可以在指定函數(shù)中加入打印日志功能的代碼。其中,如圖2所示,步驟s3可以具體包括:
s31、在指定函數(shù)中加入打印日志的代碼。
仍以上述描述的flash文件為swf文件為例,對于swf文件中的actionscript代碼文件,日志打印的實現(xiàn)是調(diào)用其中的trace函數(shù),該函數(shù)有一個參數(shù)就是一個字符串用于將其輸出出來進行顯示。
那么要想實現(xiàn)在指定函數(shù)中加入打印日志的代碼,在需要打印日志的地方插入trace函數(shù)的調(diào)用即可。而對于abc代碼中插入調(diào)用trace功能的代碼需要使用編寫的abc的代碼來加入,具體則對應于avm引擎的代碼指令,具體需要插入的代碼實現(xiàn)如下:
findpropstrictqname(packagenamespace(""),"trace")
pushstring"loghere"
callpropvoidqname(packagenamespace(""),"trace")1
上述3條abc字節(jié)碼則實現(xiàn)了在當前位置調(diào)用trace功能來打印一條“l(fā)oghere”的日志。其中,對于第一條指令findpropstrict則表示從當前的作用域中查找一個函數(shù)名trace。后續(xù)的qname(packagenamespace(""),"trace")則表示trace所在的包名的組合,其中包名是空。然后調(diào)用pushstring"loghere"來往當前的堆棧中字符串“l(fā)oghere”。最后則通過指令callpropvoid來調(diào)用trace來將當前堆棧的字符串打印出來。
同樣的方法也可以在其他需要加入打印日志功能的地方加入,加入打印日志功能后通過觀察打印日志則比較方便的可以定位哪些函數(shù)有調(diào)用以及通過查看打印日志來查看函數(shù)調(diào)用的順序。至此,通過這個步驟就實現(xiàn)了在指定函數(shù)中加入一段打印日志的代碼。
進一步的,如圖3所示,步驟s3具體還可以包括:
s32、在指定函數(shù)中加入打印局部變量的代碼。
對于定位問題或者日志輸出來說,僅僅打印一條日志不足以滿足所有的需求,對此本發(fā)明實施例中也進一步提供了可以將運行到當前環(huán)境時的局部變量的值打印出來的功能,從而可以比較方便的定位中間計算的結(jié)果是否滿足預期,該功能可以在指定函數(shù)中加入打印局部變量的代碼來實現(xiàn),具體需要插入的代碼實現(xiàn)如下:
findpropstrictqname(packagenamespace(""),"trace")
getpropertyqname(packagenamespace(""),"url")
callpropvoidqname(packagenamespace(""),"trace")1
具體區(qū)別于步驟s31的是第二條指令getproperty,該指令是用于獲取一個名稱為url的值,并將其存儲在堆棧頂。然后通過指令callpropvoid來調(diào)用trace來打印該變量的值。至此,通過這個步驟就可以實現(xiàn)在指定函數(shù)中加入打印一個局部變量的值的功能。
進一步的,如圖4所示,步驟s3具體還可以包括:
s33、在指定函數(shù)中加入打印當前函數(shù)的調(diào)用堆棧信息的代碼。
在步驟s32中加入了打印一個局部變量的代碼,但是有時候更希望能夠獲取當前函數(shù)的調(diào)用堆棧信息,以便于從堆棧信息中查找該函數(shù)是從哪里調(diào)用過來的。有了堆棧信息則便于更好的定位問題。而在actionscript中提供了一個error組件,其中有一個接口函數(shù)getstacktrace能夠獲取到當前的函數(shù)所有調(diào)用堆棧信息。具體需要插入的代碼實現(xiàn)如下:
findpropstrictqname(packagenamespace(""),"trace")
findpropstrictqname(packagenamespace(""),"error")
constructpropqname(packagenamespace(""),"error")0
callpropertyqname(packagenamespace(""),"getstacktrace")0
callpropvoidqname(packagenamespace(""),"trace")1
具體的,該步驟s33可以進一步包括:
在指定函數(shù)中加入調(diào)用actionscript中提供的error組件的代碼,該error組件中的getstacktrace接口函數(shù)用于獲取所述指定函數(shù)的所有調(diào)用堆棧信息。
對于此步驟s33與上述步驟s31、步驟s32的區(qū)別是,調(diào)用了指令findpropstrict來尋找組件error。然后調(diào)用了指令constructprop來創(chuàng)建一個error對象,然后通過指令callproperty來調(diào)用error對象的getstacktrace方法來獲取堆棧信息,最后則通過指令callpropvoid來調(diào)用trace(指定函數(shù))將堆棧信息打印出來。
至此,通過這個步驟就實現(xiàn)了在指定函數(shù)中插入一段獲取當前函數(shù)調(diào)用堆棧信息并將信息打印出來的功能。
對于步驟s4,仍以flash文件為swf文件為例,對于通過swf的反編譯工具修改了指定函數(shù)后,可以通過該工具將修改的內(nèi)容進行保存成一個新的swf文件,則通過運行最新的swf文件就會包含打印之前加入的打印日志的功能代碼。
下面介紹本發(fā)明實施例中在flash中加入打印日志功能的裝置的實施例。
請參閱圖5,為本發(fā)明實施例中在flash中加入打印日志功能的裝置的一個實施例示意圖,該在flash中加入打印日志功能的裝置包括:
獲取單元501,用于獲取需要加入打印日志功能的flash文件;
查找單元502,用于查找所述flash文件源代碼中的指定函數(shù),所述指定函數(shù)為所述flash文件源代碼中預先確定的需要加入打印日志功能的函數(shù);
添加單元503,用于在所述指定函數(shù)中加入打印日志功能的代碼;
保存單元504,用于將修改后的flash文件保存為新的flash文件。
進一步的,所述添加單元503具體用于:
在所述指定函數(shù)中加入打印日志的代碼。
進一步的,所述添加單元503具體還用于:
在所述指定函數(shù)中加入打印局部變量的代碼。
進一步的,所述添加單元503具體還用于:
在所述指定函數(shù)中加入打印當前函數(shù)的調(diào)用堆棧信息的代碼。
進一步的,所述添加單元503具體用于:
在所述指定函數(shù)中加入調(diào)用actionscript中提供的error組件的代碼,所述error組件中的getstacktrace接口函數(shù)用于獲取所述指定函數(shù)的所有調(diào)用堆棧信息。
所屬領域的技術人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統(tǒng),裝置和單元的具體工作過程,可以參考前述方法實施例中的對應過程,在此不再贅述。
在本申請所提供的幾個實施例中,應該理解到,所揭露的系統(tǒng),裝置和方法,可以通過其它的方式實現(xiàn)。例如,以上所描述的裝置實施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。
另外,在本發(fā)明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用軟件功能單元的形式實現(xiàn)。
所述集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,可以存儲在一個計算機可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明的技術方案本質(zhì)上或者說對現(xiàn)有技術做出貢獻的部分或者該技術方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設備(可以是個人計算機,服務器,或者網(wǎng)絡設備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:u盤、移動硬盤、只讀存儲器(rom,read-onlymemory)、隨機存取存儲器(ram,randomaccessmemory)、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
以上所述,以上實施例僅用以說明本發(fā)明的技術方案,而非對其限制;盡管參照前述實施例對本發(fā)明進行了詳細的說明,本領域的普通技術人員應當理解:其依然可以對前述各實施例所記載的技術方案進行修改,或者對其中部分技術特征進行等同替換;而這些修改或者替換,并不使相應技術方案的本質(zhì)脫離本發(fā)明各實施例技術方案的精神和范圍。