本發(fā)明涉及計算機(jī)技術(shù)領(lǐng)域,更具體的說是涉及監(jiān)控方法、監(jiān)控裝置、監(jiān)控設(shè)備和存儲介質(zhì)。
背景技術(shù):
僵尸(zombie)對象可指已經(jīng)釋放的objective-c對象。應(yīng)用程序(例如移動app)在運行過程中,使用zombie對象會導(dǎo)致程序崩潰(crash)或者邏輯錯誤,此時,會產(chǎn)生崩潰日志(crashlog)。
但crashlog包含的信息少,并遠(yuǎn)離內(nèi)存釋放現(xiàn)場,因此,很難通過crashlog發(fā)現(xiàn)和定位使用zombie對象的問題。
技術(shù)實現(xiàn)要素:
有鑒于此,本發(fā)明實施例提供監(jiān)控方法、監(jiān)控裝置、監(jiān)控設(shè)備和存儲介質(zhì),以主動發(fā)現(xiàn)使用zombie對象的問題,并收集與內(nèi)存釋放現(xiàn)場相關(guān)的信息。
為實現(xiàn)上述目的,本發(fā)明實施例提供如下技術(shù)方案:
一種監(jiān)控方法,包括:
釋放目標(biāo)對象持有的資源;其中,所述目標(biāo)對象為需釋放的對象,并且所述目標(biāo)對象需被監(jiān)控;
記錄所述目標(biāo)對象的對象信息和釋放棧信息,并保留所述目標(biāo)對象占用的內(nèi)存;所述釋放棧信息表征了所述目標(biāo)對象的釋放路徑;
若攔截到向所述目標(biāo)對象發(fā)送的調(diào)用消息,上報所述目標(biāo)對象的相關(guān)信息,所述相關(guān)信息至少包括所述對象信息和所述釋放棧信息。
在一個可能的設(shè)計中,在對所述目標(biāo)對象執(zhí)行延遲釋放策略之前,還包括:判斷需釋放的對象是否滿足監(jiān)控條件;如滿足,確定所述需釋放的對象為目標(biāo)對象。
在一個可能的設(shè)計中,若攔截到向所述目標(biāo)對象發(fā)送的調(diào)用消息,還包括:獲取所述目標(biāo)對象的調(diào)用棧信息;所述調(diào)用棧信息表征了所述目標(biāo)對象的調(diào)用路徑;所述相關(guān)信息還包括所述調(diào)用棧信息。
在一個可能的設(shè)計中,在所述記錄所述目標(biāo)對象的對象信息和釋放棧信息,并保留所述目標(biāo)對象占用的內(nèi)存之后,還包括:將所述目標(biāo)對象的isa指針更改為指向攔截類;所述攔截類至少用于實現(xiàn)攔截向所述目標(biāo)對象發(fā)送的調(diào)用消息,以及,若攔截到向所述目標(biāo)對象發(fā)送的調(diào)用消息,上報所述目標(biāo)對象的相關(guān)信息。
在一個可能的設(shè)計中,上述方法還包括:將所述目標(biāo)對象放入延遲釋放隊列,所述延遲釋放隊列中包括至少一個需監(jiān)控的對象。
在一個可能的設(shè)計中,上述方法還包括:在滿足內(nèi)存釋放條件時,釋放所述延遲釋放隊列中全部或部分對象占用的內(nèi)存。
在一個可能的設(shè)計中,所述內(nèi)存釋放條件包括:所述延遲釋放隊列已滿和系統(tǒng)內(nèi)存不足中的至少一種。
在一個可能的設(shè)計中,所述相關(guān)信息還包括:所述調(diào)用消息對應(yīng)的方法名。
在一個可能的設(shè)計中,上述方法還包括:在任一需監(jiān)控的對象新增引用對象后,記錄所述任一需監(jiān)控的對象的引用路徑;在任一需監(jiān)控的與其引用對象解除引用關(guān)系后,記錄所述任一需監(jiān)控的對象的解除引用路徑。
在一個可能的設(shè)計中,在上報所述目標(biāo)對象的相關(guān)信息后,還包括:釋放所述目標(biāo)對象占用的內(nèi)存。
一種監(jiān)控裝置,包括:
釋放單元,用于釋放目標(biāo)對象持有的資源;其中,所述目標(biāo)對象為需釋放的對象,并且所述目標(biāo)對象需被監(jiān)控;
記錄單元,記錄所述目標(biāo)對象的對象信息和釋放棧信息,并保留所述目標(biāo)對象占用的內(nèi)存;所述釋放棧信息表征了所述目標(biāo)對象的釋放路徑;
攔截上報單元,用于若攔截到向所述目標(biāo)對象發(fā)送的調(diào)用消息,上報所述目標(biāo)對象的相關(guān)信息,所述相關(guān)信息至少包括所述對象信息和所述釋放棧信息。
在一個可能的設(shè)計中,所述記錄單元或攔截上報單元還用于:若攔截到向所述目標(biāo)對象發(fā)送的調(diào)用消息,獲取所述目標(biāo)對象的調(diào)用棧信息;所述調(diào)用棧信息表征了所述目標(biāo)對象的調(diào)用路徑;所述相關(guān)信息還包括所述調(diào)用棧信息。
在一個可能的設(shè)計中,在所述記錄單元記錄所述目標(biāo)對象的對象信息和釋放棧信息,并保留所述目標(biāo)對象占用的內(nèi)存之后,所述釋放單元還用于:將所述目標(biāo)對象的isa指針更改為指向攔截類;所述攔截類至少用于實現(xiàn)攔截向所述目標(biāo)對象發(fā)送的調(diào)用消息,以及,若攔截到向所述目標(biāo)對象發(fā)送的調(diào)用消息,上報所述目標(biāo)對象的相關(guān)信息。
一種監(jiān)控設(shè)備,至少包括處理器和存儲器;所述處理器通過執(zhí)行所述存儲器中存放的程序以及調(diào)用其他設(shè)備,執(zhí)行上述的監(jiān)控方法。
本發(fā)明實施例還提供一種存儲介質(zhì),所述存儲介質(zhì)存儲有多條指令,所述指令適于處理器進(jìn)行加載,以執(zhí)行本發(fā)明實施例所提供的任一種監(jiān)控方法中的步驟。
可見,在本申請實施例中,對于需釋放且需被監(jiān)控的目標(biāo)對象,在釋放時并不會完全釋放目標(biāo)對象,而是保留其占用的內(nèi)存,這樣,目標(biāo)對象就成為仍占用內(nèi)存的zombie對象。此外本申請實施例還會記錄內(nèi)存釋放現(xiàn)場的相關(guān)信息,例如目標(biāo)對象的對象信息和釋放棧信息。若攔截到發(fā)送給目標(biāo)對象的調(diào)用消息,則說明發(fā)生了使用(調(diào)用)zombie對象的問題,之后,會上報之前記錄的對象信息、釋放棧信息等。這樣,本申請實施例通過主動制造zombie對象,攔截向所制造zombie對象發(fā)送的調(diào)用消息,并上報被調(diào)用的zombie對象的相關(guān)信息的方式,來主動暴露使用zombie對象的問題。而上報的相關(guān)信息是內(nèi)存釋放現(xiàn)場的相關(guān)信息,后續(xù)可用于分析出現(xiàn)使用zombie對象的錯誤的原因,從而解決了現(xiàn)有方式中很難通過crashlog發(fā)現(xiàn)和定位使用zombie對象的問題。
附圖說明
圖1為本發(fā)明實施例提供的監(jiān)控設(shè)備的計算機(jī)架構(gòu)示例圖;
圖2為本發(fā)明實施例提供的監(jiān)控裝置的示例性結(jié)構(gòu)圖;
圖3、4、5為本發(fā)明實施例提供的監(jiān)控方法的示例性流程圖。
具體實施方式
設(shè)備(例如移動終端)的app可能會存在使用zombie對象的問題。本發(fā)明提供的監(jiān)控方法及相關(guān)裝置(例如監(jiān)控裝置、監(jiān)控設(shè)備、存儲介質(zhì)),可主動發(fā)現(xiàn)使用zombie對象的問題,并收集與內(nèi)存釋放現(xiàn)場相關(guān)的信息。
上述監(jiān)控方法示例性得可適用于app開發(fā)測試環(huán)境,此外,也可應(yīng)用于app的正式運行環(huán)境中,可通過后臺開關(guān)觸發(fā)或禁止監(jiān)控裝置執(zhí)行上述監(jiān)控方法。
上述監(jiān)控裝置可以軟件的形式應(yīng)用于監(jiān)控設(shè)備(例如移動終端)中,當(dāng)以軟件形式存在時,上述監(jiān)控裝置具體可為獨立的app,也可作為某app或操作系統(tǒng)的組件。
上述監(jiān)控裝置也可以硬件的形式應(yīng)用于監(jiān)控設(shè)備中,當(dāng)以硬件形式存在時,上述監(jiān)控裝置具體可為監(jiān)控設(shè)備的處理器,或監(jiān)控設(shè)備的存儲介質(zhì)。
圖1示出了上述監(jiān)控設(shè)備的一種通用計算機(jī)系統(tǒng)結(jié)構(gòu)。
上述計算機(jī)系統(tǒng)可包括總線、處理器1、存儲器2、通信接口3、輸入設(shè)備4和輸出設(shè)備5。處理器1、存儲器2、通信接口3、輸入設(shè)備4和輸出設(shè)備5通過總線相互連接。其中:
總線可包括一通路,在計算機(jī)系統(tǒng)各個部件之間傳送信息。
處理器1可以是通用處理器,例如通用中央處理器(cpu)、網(wǎng)絡(luò)處理器(networkprocessor,簡稱np)、微處理器等,也可以是特定應(yīng)用集成電路(application-specificintegratedcircuit,asic),或一個或多個用于控制本發(fā)明方案程序執(zhí)行的集成電路。還可以是數(shù)字信號處理器(dsp)、現(xiàn)成可編程門陣列(fpga)或者其他可編程邏輯器件、分立門或者晶體管邏輯器件、分立硬件組件。
處理器1可包括主處理器(cpu)。
處理器1的個數(shù)可為一個或多個。
存儲器2中保存有執(zhí)行本發(fā)明技術(shù)方案的程序,還可以保存有操作系統(tǒng)和其他關(guān)鍵業(yè)務(wù)。具體地,程序可以包括程序代碼,程序代碼包括多條計算機(jī)操作指令。上述指令適于處理器1進(jìn)行加載,以執(zhí)行本發(fā)明實施例所提供的任一種監(jiān)控方法中的步驟。
更具體的,存儲器2可以包括只讀存儲器(read-onlymemory,rom)、可存儲靜態(tài)信息和指令的其他類型的靜態(tài)存儲設(shè)備、隨機(jī)存取存儲器(randomaccessmemory,ram)、可存儲信息和指令的其他類型的動態(tài)存儲設(shè)備、磁盤存儲器、flash等等。
輸入設(shè)備4可包括接收用戶輸入的數(shù)據(jù)和信息的裝置,例如鍵盤、鼠標(biāo)、攝像頭、掃描儀、光筆、語音輸入裝置、觸摸屏、計步器或重力感應(yīng)器等。
輸出設(shè)備5可包括允許輸出信息給用戶的裝置,例如顯示屏、打印機(jī)、揚聲器等。
通信接口3可包括使用任何收發(fā)器一類的裝置,以便與其他設(shè)備或通信網(wǎng)絡(luò)通信,如以太網(wǎng),無線接入網(wǎng)(ran),無線局域網(wǎng)(wlan)等。
處理器1通過執(zhí)行存儲器2中所存放的程序以及調(diào)用其他設(shè)備,可實現(xiàn)下述實施例提供的監(jiān)控方法。
圖2示出了上述監(jiān)控裝置的一種示例結(jié)構(gòu),可包括釋放單元201、記錄單元202、攔截上報單元203,本文后續(xù)將結(jié)合監(jiān)控方法對上述各單元的功能進(jìn)行介紹。
此外,上述各單元的功能,可由前述的處理器1執(zhí)行存儲器2中所存放的程序以及調(diào)用其他設(shè)備實現(xiàn)。
圖3示出了上述監(jiān)控方法的一種示例性流程,包括:
在301部分:釋放目標(biāo)對象持有的資源。
可由前述釋放單元201執(zhí)行301部分。
上述目標(biāo)對象為需要釋放且需被監(jiān)控的對象。
在arc(automaticreferencecounting,自動引用計數(shù))內(nèi)存管理機(jī)制中,當(dāng)某一對象的引用計數(shù)值減到零時,該對象需要釋放。
在一個示例中,任一需要釋放的對象均可為目標(biāo)對象。在另一個示例中,可選擇性得監(jiān)控一部分需要釋放的對象。示例性的,可過濾掉系統(tǒng)對象,將用戶自定義對象作為目標(biāo)對象。
以移動終端為例,很多移動終端的app是采用objective-c語言設(shè)計的。objective-c語言中共兩大類對象:objective-c對象和block(塊)對象。其中,objective-c對象是用戶自定義對象,而block對象是系統(tǒng)內(nèi)部對象,對用戶是不可見的。因此,示例性的,可默認(rèn)不監(jiān)控block對象,對objective-c對象進(jìn)行監(jiān)控,將需釋放的objective-c對象作為目標(biāo)對象。
至于目標(biāo)對象持有的資源,可為目標(biāo)對象對其引用的對象(簡稱為引用對象)的所有權(quán)。因此,釋放目標(biāo)對象持有的資源可包含:釋放目標(biāo)對象對其引用對象持有的所有權(quán)。
舉例來講,假定對象a引用了對象b,而對象a為目標(biāo)對象,則會釋放對象a對對象b的所有權(quán)。
在302部分:記錄上述目標(biāo)對象的對象信息和釋放棧信息。
上述對象信息可包括目標(biāo)對象的class(類)信息,包括類名、屬性等。
需要說明的是,類是對象的抽象,而對象是類的具體實例。類是抽象的,不占用內(nèi)存,而對象是具體的,占用存儲空間。
至于釋放棧信息(或稱釋放棧)則表征了目標(biāo)對象的釋放路徑,或者說表征了目標(biāo)對象釋放時的函數(shù)調(diào)用路徑。釋放棧也即釋放位置。
舉例來講,函數(shù)a調(diào)用函數(shù)b,函數(shù)b調(diào)用函數(shù)c(例如dealloc方法),在函數(shù)c釋放目標(biāo)對象。則釋放棧信息包括函數(shù)a、b、c。
由于可能有很多函數(shù)會調(diào)用函數(shù)c來釋放對象,所以需要記錄下釋放目標(biāo)對象時的釋放路徑。系統(tǒng)會提供方法得到釋放路徑。
在303部分:保留目標(biāo)對象占用的內(nèi)存。
保留目標(biāo)對象占用的內(nèi)存,目標(biāo)對象就成為仍占用內(nèi)存的zombie對象??梢?,本申請通過主動制造zombie對象,來主動發(fā)現(xiàn)使用zombie對象的問題。
可由前述記錄單元202執(zhí)行302和303部分。
在304部分:若攔截到向目標(biāo)對象發(fā)送的調(diào)用消息,上報目標(biāo)對象的相關(guān)信息。
可由前述的攔截上報單元203執(zhí)行304部分。
在一個示例中,攔截上報單元203可將上述相關(guān)信息上報至統(tǒng)計分析平臺。后續(xù)統(tǒng)計平臺會根據(jù)上報的相關(guān)信息,分析使用zombie對象的原因。
本領(lǐng)域技術(shù)人員可根據(jù)實際需要靈活設(shè)計上報相關(guān)信息至哪一設(shè)備、系統(tǒng)或平臺等,在此不作贅述。
在一個示例中,上述相關(guān)信息至少可包括在302部分記錄的對象信息和釋放棧信息。
在本發(fā)明其他實施例中,上述相關(guān)信息還可包括調(diào)用棧信息。
與釋放棧信息相類似,調(diào)用棧信息(或稱調(diào)用棧)表征了zombie對象(目標(biāo)對象)的調(diào)用路徑。調(diào)用棧也即調(diào)用位置。
例如:函數(shù)a調(diào)用了函數(shù)b,調(diào)用了函數(shù)c,函數(shù)c調(diào)用了zombie對象(目標(biāo)對象)。則調(diào)用棧信息包括函數(shù)a、b、c。系統(tǒng)會提供方法得到調(diào)用路徑。
此外,上述相關(guān)信息還可包括上述調(diào)用消息對應(yīng)的方法名,仍沿用前例,由于是函數(shù)c調(diào)用了zombie對象(目標(biāo)對象),則方法名為函數(shù)c的名稱。
可由前述的記錄單元202或攔截上報單元203獲取上述調(diào)用棧信息和調(diào)用消息對應(yīng)的方法名,由記錄單元202予以記錄。
需要說明的是,發(fā)生使用zombie對象的原因至少包括:
一,zombie對象的類存在問題;
二,在不正確的釋放位置提前釋放了對象;
三,對象釋放后函數(shù)對釋放了的對象的錯誤調(diào)用。
而上述相關(guān)信息有助于分析是哪一種原因?qū)е碌氖褂脄ombie對象。在上述相關(guān)信息中:
對象信息的類名有助于分析、定位目標(biāo)對象,因為每一對象雖然有唯一的地址,但地址并不能定位對象,需要通過類名來定位對象。對于zombie對象的類存在問題的情況,可使用對象信息中的類名確定存在問題的類,后續(xù)可修改該類,避免使用zombie對象的現(xiàn)象的發(fā)生;
釋放棧信息有助于分析、定位是否在不正確的釋放位置提前釋放了對象,或者是否錯誤釋放了不該釋放的對象;
調(diào)用棧信息有助于定位使用zombie對象的位置,可用于定位發(fā)生調(diào)用錯誤的函數(shù)。
可見,在本申請實施例中,對于需釋放且需被監(jiān)控的目標(biāo)對象,在釋放時并不會完全釋放目標(biāo)對象,而是保留其占用的內(nèi)存,這樣,目標(biāo)對象就成為仍占用內(nèi)存的zombie對象。此外本申請實施例還會記錄內(nèi)存釋放現(xiàn)場的相關(guān)信息,例如目標(biāo)對象的對象信息和釋放棧信息。若攔截到發(fā)送給目標(biāo)對象的調(diào)用消息,則說明發(fā)生了使用zombie對象的問題,之后,會上報之前記錄的對象信息、釋放棧信息等。這樣,本申請實施例通過主動制造zombie對象,攔截向所制造zombie對象發(fā)送的調(diào)用消息,并上報被調(diào)用的zombie對象的相關(guān)信息的方式,來主動暴露使用zombie對象的問題。而上報的相關(guān)信息是內(nèi)存釋放現(xiàn)場的相關(guān)信息,后續(xù)可用于分析出現(xiàn)使用zombie對象的錯誤的原因,從而解決了現(xiàn)有方式中很難通過crashlog發(fā)現(xiàn)和定位使用zombie對象的問題。
下面將以objective-c對象(對象a)需要釋放為例,對本申請?zhí)峁┑募夹g(shù)方案進(jìn)行更為詳細(xì)的介紹。
請參見圖4,圖4示出了上述監(jiān)控方法的另一種示例性流程,包括:
在400部分:對象a在釋放時調(diào)用dealloc方法(函數(shù))。
在arc內(nèi)存管理機(jī)制中,當(dāng)對象a的引用計數(shù)為0,系統(tǒng)會自動調(diào)用dealloc方法。
因此,可重新設(shè)計新的dealloc方法替換(swizzling)系統(tǒng)原有的dealloc方法的實現(xiàn),利用新的dealloc方法來實現(xiàn)監(jiān)控所有objective-c對象的釋放。
在一個示例中,可由前述釋放單元201調(diào)用重新設(shè)計的dealloc方法?;蛘咭部梢哉f,重新設(shè)計的dealloc方法實現(xiàn)了上述釋放單元201和記錄單元202的全部或部分功能。
在401部分:判斷是否監(jiān)控對象a。如果是,進(jìn)入403部分,否則,進(jìn)入402部分。
具體的,可判斷需釋放的對象(例如對象a)是否滿足監(jiān)控條件,如果是,執(zhí)行監(jiān)控策略,進(jìn)入403部分,否則,進(jìn)入402部分。
前述提及了,可只監(jiān)控自定義對象而不監(jiān)控系統(tǒng)對象。因此,監(jiān)控條件可以是:需釋放的對象是自定義對象。
或者,監(jiān)控條件也可以包括:該對象所關(guān)聯(lián)的類(class)需被監(jiān)控。在一個示例中,可預(yù)先配置需要監(jiān)控的class,如果對象a所關(guān)聯(lián)的類屬于需要監(jiān)控的類,則進(jìn)入403部分。
在402部分:直接釋放對象a。
若不需要監(jiān)控對象a,則會釋放對象a持有的資源、其占有的內(nèi)存等。
可由前述釋放單元201調(diào)用重新設(shè)計的dealloc方法完成402部分。
在403部分:釋放對象a持有的資源;
更具體的,可調(diào)用對象a的析構(gòu)函數(shù)(objc_destructlnstance方法),釋放對象a持有的資源。析構(gòu)函數(shù)與構(gòu)造函數(shù)相反,當(dāng)對象結(jié)束其生命周期時,系統(tǒng)自動執(zhí)行析構(gòu)函數(shù)。析構(gòu)函數(shù)往往用來做“清理善后”的工作。
403部分與前述301部分相類似,在此不作贅述。
在404部分:記錄對象a的對象信息(class信息)和釋放棧信息。
在一個示例中,可將對象a的對象信息和釋放棧信息存在一個類里面。
404部分與前述302部分相類似,在此不作贅述。
在405部分:更改對象a的isa指針。
可由前述的釋放單元201調(diào)用重新設(shè)計的dealloc方法完成405部分。此外,404部分和405部分也可同時執(zhí)行。
假定對象a的isa指針原指向class1,則在404部分會記錄class1的信息。
而在本部分會更改對象a的isa指針,使之不再指向class1,而指向另一個自定義的攔截類——handlerclass。
需要說明的是,isa指針是一個class類型的指針,每個對象有isa指針,它指向該對象的類(class)。
此外,class其實是元類(meteclass)的實例,則每一個class也有isa指針,指向該class的元類;同理,元類也有isa指針,它的isa指針指向其根元類(rootmeteclass),而根元類的isa指針則指向本身,這樣形成了一個封閉的內(nèi)循環(huán)。
現(xiàn)回到介紹handlerclass這里,handlerclass至少可用于實現(xiàn)攔截向目標(biāo)對象發(fā)送的調(diào)用消息,以及,若攔截到向目標(biāo)對象發(fā)送的調(diào)用消息,上報該目標(biāo)對象的相關(guān)信息。
仍以對象a為例,根據(jù)objective-c消息轉(zhuǎn)發(fā)機(jī)制,假定有函數(shù)調(diào)用對象a,則該函數(shù)會向?qū)ο骯發(fā)送調(diào)用消息。而由于對象a的isa指針指向了handlerclass,則向?qū)ο骯發(fā)送調(diào)用消息相當(dāng)于向handlerclass發(fā)調(diào)用消息。則handlerclass可攔截向?qū)ο骯發(fā)送的調(diào)用消息,并上報對象a的相關(guān)信息。
具體的,handlerclass可被設(shè)計為至少用于完成上述304部分。此外,本實施例后續(xù)的407-408部分,也由handlerclass完成。
在406部分:將對象a(目標(biāo)對象)放入延遲釋放隊列。
需要注意的是,在403-406并沒有釋放對象a的內(nèi)存。這是為了要令對象a成為仍占用內(nèi)存的zombie對象。
延遲釋放隊列中包括至少一個需監(jiān)控的對象(zombie對象)。
由于延遲釋放隊列中的對象均沒有釋放占用的內(nèi)存,為了提升性能,可在滿足內(nèi)存釋放條件時,釋放延遲釋放隊列中全部或部分對象占用的內(nèi)存。
在一個示例中,可由釋放單元201在滿足內(nèi)存釋放條件時,釋放延遲釋放隊列中全部或部分對象占用的內(nèi)存。
示例性的,內(nèi)存釋放條件可包括:延遲釋放隊列已滿和系統(tǒng)內(nèi)存不足中的至少一種。
具體的,可對延遲釋放隊列的大小做了限制,超出了限制(隊列已滿),則可按先入先出或其他規(guī)則釋放延遲釋放隊列中全部或部分對象占用的內(nèi)存。
此外,很多移動終端在內(nèi)存不足時,會選擇關(guān)閉部分app(俗稱殺掉)。當(dāng)內(nèi)存不足時,系統(tǒng)會向app發(fā)送通知。為了防止app因系統(tǒng)內(nèi)存不足被系統(tǒng)殺掉,在收到通知后,可按先入先出或其他規(guī)則釋放延遲釋放隊列中全部或部分對象占用的內(nèi)存,從而減少對系統(tǒng)內(nèi)存的占用。
下面部分,將由handlerclass完成。或者說,handlerclass實現(xiàn)了前述攔截上報單元203的全部功能。
在407部分:攔截向延遲釋放隊列中任一對象發(fā)送的調(diào)用消息。
仍以對象a為例,請參見圖5,假定有函數(shù)向延遲釋放隊列中的對象a發(fā)送調(diào)用消息,則handlerclass將攔截到該調(diào)用消息。
在具體實現(xiàn)時,handlerclass中的forwardinvocation函數(shù)可攔截到向延遲釋放隊列中任一對象發(fā)送的調(diào)用消息。
在一個示例中,在攔截到調(diào)用消息后,handlerclass還可獲取上述任一對象的調(diào)用棧信息和該調(diào)用消息對應(yīng)的方法名。
在408部分:上報上述任一對象的相關(guān)信息。
相關(guān)信息可包括:對象信息、釋放棧信息、調(diào)用棧信息、調(diào)用消息對應(yīng)的方法名等。
相關(guān)描述請參見前述304部分,在此不作贅述。
而通過上述對象信息、釋放棧信息和調(diào)用棧信息等,可快速定位到被使用的zombie對象、該zombie對象的釋放位置、使用該zombie對象的調(diào)用棧和方法名,從而快速定位zombie問題。
需要說明的是,若監(jiān)測到延遲釋放隊列中某一對象被使用,可釋放掉該對象占用的內(nèi)存。
在一個示例中,在上報了任一對象的相關(guān)信息,可釋放掉該對象占用的內(nèi)存,釋放掉所占用內(nèi)存的對象將從延遲釋放隊列中移除。
需要說明的是,在本示例中延遲釋放隊列中的對象都是未被監(jiān)測至被調(diào)用的zombie對象,因此,當(dāng)監(jiān)測至延遲釋放隊列中的某對象被使用(調(diào)用)時,在釋放掉所占用的內(nèi)存后,該對象將從延遲釋放隊列中移除。更具體的,可由釋放單元201或管理類釋放被使用(調(diào)用)的zombie對象占用的內(nèi)存,并移除該對象。
而在滿足上述內(nèi)存釋放條件,則會釋放延遲釋放隊列中的全部或部分對象占用的內(nèi)存(請注意在此場景下,這些被釋放了所占用內(nèi)存的對象,實際上并未被監(jiān)測到被調(diào)用),以減少對系統(tǒng)內(nèi)存占用的目的。
而在另一示例中,在上報了任一對象的相關(guān)信息,也可不釋放該任一對象所占用的內(nèi)存,不將其移除出延遲釋放隊列。此外,在本示例中,可在滿足上述內(nèi)存釋放條件,釋放延遲釋放隊列中的全部或部分對象占用的內(nèi)存。
更具體的,可由釋放單元201或管理類釋放延遲釋放隊列中的全部或部分對象占用的內(nèi)存。
此外,在本申請其他實施例中,為了進(jìn)一步收集信息,可進(jìn)行如下跟蹤:
一,在任一需監(jiān)控的對象新增引用對象后,記錄該對象的引用路徑;
在一個示例中,可采用前述實施例提及的監(jiān)控條件來判斷一對象是否需監(jiān)控。
引用路徑可理解為增加引用關(guān)系時的調(diào)用路徑,其與前述的調(diào)用?;蛘{(diào)用路徑相類似:
假定,函數(shù)c調(diào)用函數(shù)d,函數(shù)d調(diào)用函數(shù)f(例如retain方法),在函數(shù)f實現(xiàn)了對象a引用對象b。則引用路徑包括函數(shù)c、d、f。
在現(xiàn)有技術(shù)中,若對象a增加了引用對象,則使用retain方法為對象a的引用計數(shù)加1。
為提供跟蹤能力,可設(shè)計新的retain方法:新的retain方法除了可執(zhí)行為對象的引用計數(shù)加1的操作外,也可記錄該對象的引用路徑。
二,在任一需監(jiān)控的與其引用對象解除引用關(guān)系后,記錄該對象的解除引用路徑。
解除引用路徑可理解為解除引用關(guān)系時的調(diào)用路徑。舉例來講,假定函數(shù)c調(diào)用函數(shù)d,函數(shù)d調(diào)用函數(shù)w(例如release方法),在函數(shù)w實現(xiàn)了對象a與對象b解除引用關(guān)系。則解除引用路徑包括函數(shù)c、d、w。
在現(xiàn)有技術(shù)中,若對象a與某引用對象解除了引用關(guān)系,則使用release方法為對象a的引用計數(shù)減1。
為提供跟蹤能力,可設(shè)計新的release方法:新的release方法除了可執(zhí)行為對象的引用計數(shù)減1的操作外,也可記錄該對象的解除引用路徑。
記錄引用路徑和解除引用路徑,可用于后續(xù)分析引用和解除引用是否匹配,以及,是否提前/錯誤釋放了對象。因此,在攔截到向目標(biāo)對象發(fā)送的調(diào)用消息時,上報的相關(guān)消息中也可包含目標(biāo)對象的引用路徑和解除引用路徑。
此外,為了提高靈活性和控制風(fēng)險,還提供云端提供配置能力,以配置監(jiān)控策略:
監(jiān)控策略內(nèi)容可包括:
是否需要監(jiān)控;
監(jiān)控的類;
是否監(jiān)控retain(如選擇監(jiān)控,在任一需監(jiān)控的對象新增引用對象后,記錄該對象的引用路徑);
是否監(jiān)控release等(如選擇監(jiān)控,在任一需監(jiān)控的與其引用對象解除引用關(guān)系后,記錄該對象的解除引用路徑)。
需要注意的是,現(xiàn)有技術(shù)方案在發(fā)現(xiàn)有使用zombie對象問題的時候,會連接到instruments工具進(jìn)行人工定位。其最大的缺點是必須連接到instruments工具,無法定位線上問題。由于很多zombie對象問題很難復(fù)現(xiàn),所以現(xiàn)有技術(shù)對定位zombie對象非常不便。
另外,使用zombie對象不一定導(dǎo)致crash,可能只是導(dǎo)致邏輯錯誤,因此,如何發(fā)現(xiàn)“使用zombie對象”也是一個難題。
而本申請?zhí)峁┑募夹g(shù)方案,利用objective-c語言動態(tài)特性和消息轉(zhuǎn)發(fā)機(jī)制,主動制造zombie對象,一旦攔截到向zombie對象發(fā)送的消息,即上報相關(guān)信息。提高了使用zombie對象的主動發(fā)現(xiàn)率和定位能力。
此外,本技術(shù)方案還支持后臺配置監(jiān)控對象過濾、監(jiān)控策略,以此提高監(jiān)控靈活性及風(fēng)險控制。
對于c\c++對象的zombie問題,由于,c\c++對象在釋放時采用free方法進(jìn)行釋放,因此可重新設(shè)計新的free方法來監(jiān)控c\c++對象的釋放,采集相應(yīng)的信息。
同時,可使用系統(tǒng)內(nèi)存特性,更改釋放了的c\c++對象指向內(nèi)存的讀寫屬性,令其指向的內(nèi)存無法讀寫,后續(xù)如果有函數(shù)或?qū)ο髮\c++zombie對象的內(nèi)存進(jìn)行讀寫,就會發(fā)生crash或邏輯錯誤,從而達(dá)到監(jiān)控使用c\c++zombie對象zombie的問題。
專業(yè)人員可以意識到,結(jié)合本文中所公開的實施例描述的各示例的單元及算法步驟,能夠以電子硬件、計算機(jī)軟件或者二者的結(jié)合來實現(xiàn),為了清楚地說明硬件和軟件的可互換性,在上述說明中已經(jīng)按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬件還是軟件方式來執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計約束條件。專業(yè)技術(shù)人員可以對每個特定的應(yīng)用來使用不同方法來實現(xiàn)所描述的功能,但是這種實現(xiàn)不應(yīng)認(rèn)為超出本發(fā)明的范圍。
結(jié)合本文中所公開的實施例描述的方法或算法的步驟可以直接用硬件、處理器執(zhí)行的軟件模塊,或者二者的結(jié)合來實施。軟件模塊可以置于隨機(jī)存儲器(ram)、內(nèi)存、只讀存儲器(rom)、電可編程rom、電可擦除可編程rom、寄存器、硬盤、可移動磁盤、wd-rom、或技術(shù)領(lǐng)域內(nèi)所公知的任意其它形式的存儲介質(zhì)中。
對所公開的實施例的上述說明,使本領(lǐng)域?qū)I(yè)技術(shù)人員能夠?qū)崿F(xiàn)或使用本發(fā)明。對這些實施例的多種修改對本領(lǐng)域的專業(yè)技術(shù)人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本發(fā)明的精神或范圍的情況下,在其它實施例中實現(xiàn)。因此,本發(fā)明將不會被限制于本文所示的這些實施例,而是要符合與本文所公開的原理和新穎特點相一致的最寬的范圍。