雖然商業(yè)可用的計(jì)算機(jī)程序通常是非??煽康?,但是程序能夠遇到導(dǎo)致故障的問題,所述故障使程序停止運(yùn)行(functioning)。這樣的故障被稱作“崩潰”??梢允钩绦虮罎⒌膯栴}包括硬件錯(cuò)誤(例如,有缺陷的存儲(chǔ)器位置)、程序中的邏輯錯(cuò)誤(例如,使用無(wú)效的存儲(chǔ)器地址)、不兼容的組件(例如,鏈接到過時(shí)的函數(shù))等。當(dāng)程序崩潰時(shí),由于產(chǎn)生硬件或軟件異常,操作系統(tǒng)通常取得控制權(quán)。硬件異??赡艹鲇诟鞣N原因而產(chǎn)生,包括試圖用零做除數(shù)、使用無(wú)效的存儲(chǔ)器地址、無(wú)效指令的嘗試執(zhí)行等等。程序在其上執(zhí)行的處理器的指令集架構(gòu)定義了不同類型的異常,并且其中當(dāng)產(chǎn)生異常的每一個(gè)類型時(shí),控制被轉(zhuǎn)移。程序或操作系統(tǒng)通常針對(duì)硬件異常的每一個(gè)類型安裝硬件異常處理程序。相反,軟件異常由軟件檢測(cè)到異常情況而產(chǎn)生。例如,當(dāng)函數(shù)經(jīng)過無(wú)效參數(shù)時(shí)、當(dāng)C++異常沒有被捕捉到等等,軟件異??赡墚a(chǎn)生。程序或操作系統(tǒng)通常針對(duì)每一個(gè)類型的軟件異常安裝軟件異常處理程序。當(dāng)產(chǎn)生異常時(shí),針對(duì)該類型的異常的異常處理程序被調(diào)用來(lái)處理異常。每一個(gè)異常處理程序基于異常的嚴(yán)重程度來(lái)判定程序是否繼續(xù)其執(zhí)行或者終止其執(zhí)行,導(dǎo)致崩潰。
當(dāng)程序崩潰時(shí),操作系統(tǒng)通常收集關(guān)于崩潰的信息,基于所收集的信息生成崩潰報(bào)告,并且使崩潰報(bào)告對(duì)于崩潰的程序的開發(fā)者而言可用。當(dāng)由操作系統(tǒng)安裝的崩潰處理程序被調(diào)用時(shí),崩潰處理程序通常以處理器的監(jiān)督權(quán)限模式(例如,監(jiān)督模式或內(nèi)核模式)來(lái)執(zhí)行。因?yàn)楸罎⑻幚沓绦蛞员O(jiān)督權(quán)限模式來(lái)執(zhí)行,所以崩潰處理程序可以訪問操作系統(tǒng)的所有數(shù)據(jù)結(jié)構(gòu)以及崩潰的程序的數(shù)據(jù)結(jié)構(gòu)。訪問這些數(shù)據(jù)結(jié)構(gòu)允許崩潰處理程序收集它認(rèn)為適用于崩潰報(bào)告的任何信息。一旦生成崩潰報(bào)告,則可以使崩潰報(bào)告能夠?qū)τ陂_發(fā)者可用。例如,崩潰報(bào)告可以被傳送到崩潰報(bào)告服務(wù)器,在該崩潰報(bào)告服務(wù)器中使得崩潰報(bào)告對(duì)于開發(fā)者而言是可用的。
雖然由操作系統(tǒng)提供的崩潰報(bào)告提供了有價(jià)值的信息來(lái)幫助開發(fā)者確定程序的崩潰的原因,但是崩潰報(bào)告中的信息通常不針對(duì)程序本身或者開發(fā)者的需要而被專門定制。此外,崩潰報(bào)告服務(wù)器可以提供通用工具以由所有類型的程序的開發(fā)者使用。結(jié)果,程序的開發(fā)者可能不具有幫助確定崩潰的原因的可用的程序特定的工具。同樣,操作系統(tǒng)可以控制發(fā)送什么崩潰報(bào)告以及發(fā)送的時(shí)機(jī)。開發(fā)者可能想要這樣的控制來(lái)滿足開發(fā)者的需要。
技術(shù)實(shí)現(xiàn)要素:
提供了用于當(dāng)應(yīng)用崩潰時(shí)生成崩潰報(bào)告的用戶模式崩潰報(bào)告系統(tǒng)。用戶模式崩潰報(bào)告系統(tǒng)安裝了崩潰處理程序用于當(dāng)應(yīng)用崩潰時(shí)在與應(yīng)用相同的進(jìn)程中執(zhí)行。當(dāng)應(yīng)用崩潰時(shí),崩潰處理程序識(shí)別在崩潰時(shí)刻執(zhí)行的進(jìn)程的受害線程。崩潰處理程序然后遍歷(walk)受害線程的調(diào)用堆棧以識(shí)別用于從應(yīng)用的調(diào)用函數(shù)返回的返回地址。崩潰處理程序識(shí)別加載的模塊內(nèi)的與返回地址相對(duì)應(yīng)的偏移,并且使用識(shí)別的偏移來(lái)創(chuàng)建函數(shù)的調(diào)用鏈。崩潰處理程序然后基于識(shí)別的調(diào)用鏈來(lái)生成崩潰報(bào)告。
附圖說(shuō)明
圖1是示出了在一些實(shí)施例中的應(yīng)用在其中執(zhí)行的執(zhí)行環(huán)境的框圖。
圖2是示出了在一些實(shí)施例中的用戶模式崩潰報(bào)告系統(tǒng)的模塊表的框圖。
圖3是示出了在一些實(shí)施例中的模塊的布局的框圖。
圖4是示出了在一些實(shí)施例中的調(diào)用棧的布局的框圖。
圖5是示出了在一些實(shí)施例中的用戶模式崩潰報(bào)告系統(tǒng)的組件的框圖。
圖6是示出了在一些實(shí)施例中的崩潰處理程序的處理的流程圖。
圖7是示出了在一些實(shí)施例中的崩潰報(bào)告系統(tǒng)的調(diào)用鏈組件的添加函數(shù)的處理的流程圖。
圖8是示出了在一些實(shí)施例中的崩潰報(bào)告系統(tǒng)的查找責(zé)任(blamed)函數(shù)組件的處理的流程圖。
圖9是示出了在一些實(shí)施例中的用戶模式崩潰報(bào)告系統(tǒng)的發(fā)送崩潰報(bào)告組件的處理的流程圖。
圖10是示出了在一些實(shí)施例中的用戶模式崩潰報(bào)告系統(tǒng)的添加模塊調(diào)用棧組件的處理的流程圖。
具體實(shí)施方式
提供了一種用于當(dāng)應(yīng)用崩潰時(shí)生成用戶模式崩潰報(bào)告的方法和系統(tǒng)。在一些實(shí)施例中,用戶模式崩潰報(bào)告系統(tǒng)在與崩潰的應(yīng)用相同的進(jìn)程中(即,進(jìn)程內(nèi))執(zhí)行崩潰處理程序,并且基于進(jìn)程可訪問的信息來(lái)生成崩潰報(bào)告。用戶模式崩潰報(bào)告系統(tǒng)然后控制崩潰報(bào)告到崩潰報(bào)告服務(wù)器的發(fā)送。用戶模式崩潰報(bào)告系統(tǒng)安裝崩潰處理程序來(lái)以用戶權(quán)限模式在與崩潰的應(yīng)用相同的進(jìn)程中執(zhí)行。用戶模式崩潰報(bào)告系統(tǒng)安裝特定于下面的操作系統(tǒng)和編程環(huán)境的崩潰處理程序。例如,如果操作系統(tǒng)是蘋果公司的iOS操作系統(tǒng),那么可以安裝崩潰處理程序來(lái)處理Mach異常和BSD信號(hào)。如果編程環(huán)境是基于C++的,那么可以安裝崩潰處理程序來(lái)處理拋出的而不是捕獲的異常。當(dāng)應(yīng)用崩潰時(shí),崩潰處理程序可以識(shí)別在崩潰的時(shí)刻執(zhí)行的進(jìn)程的“受害線程”,并且然后生成在崩潰的時(shí)刻被調(diào)用的(激活的)函數(shù)的調(diào)用鏈。為了生成該調(diào)用鏈,崩潰處理程序遍歷受害線程的調(diào)用棧來(lái)識(shí)別用于從應(yīng)用的調(diào)用函數(shù)返回的返回地址。應(yīng)用的代碼被存儲(chǔ)在一個(gè)或多個(gè)模塊中,每一個(gè)模塊都包含函數(shù)。崩潰處理程序然后識(shí)別模塊內(nèi)的與返回地址相對(duì)應(yīng)的偏移,并且識(shí)別模塊內(nèi)的包括這些偏移的函數(shù)。崩潰處理程序可以針對(duì)進(jìn)程中的每一個(gè)線程而不是僅受害線程生成調(diào)用鏈。用戶模式崩潰報(bào)告系統(tǒng)然后基于在識(shí)別出的調(diào)用鏈中的函數(shù)來(lái)生成崩潰報(bào)告。因?yàn)楸罎⑻幚沓绦蛟谂c應(yīng)用相同的進(jìn)程中執(zhí)行,所以崩潰處理程序訪問了應(yīng)用的所有數(shù)據(jù)。此外,崩潰處理程序存儲(chǔ)崩潰報(bào)告,所以它們能夠被發(fā)送到崩潰報(bào)告服務(wù)器。
在一些實(shí)施例中,用戶模式崩潰報(bào)告系統(tǒng)識(shí)別對(duì)應(yīng)用的崩潰負(fù)責(zé)的應(yīng)用的函數(shù)。對(duì)崩潰負(fù)責(zé)的函數(shù)是可能在崩潰的時(shí)刻在受害線程上執(zhí)行的函數(shù)。用戶模式崩潰報(bào)告系統(tǒng)識(shí)別在崩潰的時(shí)刻調(diào)用的函數(shù)的調(diào)用鏈。用戶模式崩潰報(bào)告系統(tǒng)然后訪問識(shí)別出免于對(duì)崩潰負(fù)責(zé)的函數(shù)。當(dāng)程序?qū)⒁罎r(shí),應(yīng)用可以在減輕崩潰的影響的嘗試中調(diào)用各種管理函數(shù),從而手機(jī)一些崩潰相關(guān)的信息等。這些管理函數(shù)可能在調(diào)用鏈中,但是不對(duì)崩潰負(fù)責(zé)。這些管理函數(shù)以及不對(duì)崩潰負(fù)責(zé)的其他函數(shù)被指定為免于負(fù)責(zé)。用戶模式崩潰報(bào)告系統(tǒng)處理函數(shù)的調(diào)用鏈來(lái)識(shí)別不免于對(duì)崩潰負(fù)責(zé)的調(diào)用的最后一個(gè)函數(shù)。用戶模式崩潰報(bào)告系統(tǒng)然后將該最后一個(gè)函數(shù)指定為對(duì)于崩潰負(fù)責(zé)。指定免于負(fù)責(zé)的函數(shù)的信息可以在配置文件中指定,并且該信息指示模塊內(nèi)的函數(shù)的偏移的范圍。
圖1是示出了在一些實(shí)施例中的應(yīng)用在其中執(zhí)行的執(zhí)行環(huán)境的框圖。執(zhí)行環(huán)境100包括操作系統(tǒng)組件110、應(yīng)用環(huán)境120、以及應(yīng)用沙盒130。操作系統(tǒng)組件可以包括Mach層111、BSD層112、以及核心服務(wù)層113。Mach層提供基于內(nèi)核的服務(wù),例如,任務(wù)和線程管理、虛擬存儲(chǔ)器管理、進(jìn)程間通信、線程調(diào)度、異常處理服務(wù)(例如,Mach異常)等。BSD層提供更高層次的服務(wù),例如,POSIX API、文件系統(tǒng)實(shí)現(xiàn)、信令機(jī)制(例如,BSD信號(hào))等。核心服務(wù)層提供各種服務(wù),例如,時(shí)間和日期管理、基于流的I/O等等。應(yīng)用環(huán)境可以提供用于圖形用戶界面、事件處理、I/O服務(wù)等的API。應(yīng)用環(huán)境還可以提供應(yīng)用在其中執(zhí)行的沙盒。每一個(gè)應(yīng)用131在其自己的沙盒中執(zhí)行以防止一個(gè)應(yīng)用的壞的行為不利地影響其他應(yīng)用或者操作系統(tǒng)。沙盒提供了應(yīng)用在其中訪問被嚴(yán)格控制的資源(例如,網(wǎng)絡(luò)訪問、盤空間)的集合的環(huán)境。崩潰處理程序在與崩潰的應(yīng)用相同的沙盒中執(zhí)行。
圖2是示出了在一些實(shí)施例中的用戶模式崩潰報(bào)告系統(tǒng)的模塊表的框圖。模塊表210將模塊標(biāo)識(shí)符映射到被加載進(jìn)應(yīng)用的地址空間的模塊220的圖像。每一個(gè)模塊包含應(yīng)用的函數(shù)。模塊表包括被加載到應(yīng)用的進(jìn)程的每一個(gè)模塊的條目211。每一個(gè)條目包含關(guān)于模塊的標(biāo)識(shí)信息以及對(duì)加載的模塊的引用。為了生成模塊表,在應(yīng)用的進(jìn)程中執(zhí)行的用戶模式崩潰報(bào)告系統(tǒng)安裝添加模塊回調(diào)組件和刪除模塊回調(diào)組件,使得當(dāng)模塊分別加載到進(jìn)程(即,進(jìn)程的地址空間)中以及從進(jìn)程中卸載時(shí),系統(tǒng)可以被通知。當(dāng)模塊被加載時(shí),添加模塊回調(diào)被調(diào)用。向添加模塊回調(diào)傳遞關(guān)于模塊的信息的引用,包括模塊所加載的地址范圍、模塊的名稱、模塊的唯一生成標(biāo)識(shí)符等,并且將相對(duì)應(yīng)的條目添加到模塊表。當(dāng)模塊被卸載時(shí),調(diào)用刪除模塊回調(diào)。向刪除模塊回調(diào)傳遞對(duì)模塊的引用,并且將相對(duì)應(yīng)的條目從模塊表中刪除。
圖3是示出了在一些實(shí)施例中的模塊的布局的框圖。應(yīng)用的模塊310包括各種函數(shù),并且可以包括主函數(shù),向主函數(shù)傳遞控制以開始應(yīng)用的執(zhí)行。模塊還可以具有相關(guān)聯(lián)的模塊函數(shù)映射320,所述模塊函數(shù)映射包含模塊的每一個(gè)函數(shù)的條目,以及對(duì)應(yīng)用的地址空間中的該模塊的開始點(diǎn)的引用。模塊函數(shù)映射可以與模塊一起被提供,或者用戶模式崩潰操作系統(tǒng)可以基于對(duì)其他模塊相關(guān)的信息的分析來(lái)生成模塊函數(shù)映射。免于負(fù)責(zé)的函數(shù)表330識(shí)別出免于對(duì)崩潰負(fù)責(zé)的模塊的那些函數(shù)。在這個(gè)示例中,函數(shù)f4、f5、以及f6免于對(duì)崩潰負(fù)責(zé)。
圖4是示例了一些實(shí)施例中的調(diào)用棧的布局的框圖。如調(diào)用棧400所示出的,模塊310(圖3)的函數(shù)f1、f2、f3、f4、以及f5被調(diào)用,正如分別由它們的棧幀401、402、403、404、以及405所表示的。棧指針SP指向調(diào)用棧的頂部的棧幀。每一個(gè)棧幀可以包含用于在調(diào)用函數(shù)和被調(diào)用函數(shù)之間傳遞參數(shù)的參數(shù)區(qū)域。每一個(gè)棧幀還包含指向調(diào)用函數(shù)的棧幀的引用SP。例如,棧幀405包括指向棧幀404的引用。引用SP由函數(shù)使用用于當(dāng)它返回到調(diào)用函數(shù)時(shí),刪除其棧幀。由此,引用SP形成棧幀的鏈接的列表。每一個(gè)棧幀還包括對(duì)調(diào)用函數(shù)中的返回地址的引用RA。例如,棧幀405包括在函數(shù)f5的調(diào)用之后在函數(shù)f4中的返回地址。引用RA由返回函數(shù)使用來(lái)在調(diào)用之后返回到位置(或其它位置)。
為了生成調(diào)用鏈,用戶模式崩潰報(bào)告系統(tǒng)的崩潰處理程序遍歷調(diào)用棧來(lái)識(shí)別已經(jīng)被調(diào)用的每一個(gè)函數(shù)。可以向崩潰處理程序傳遞在崩潰的時(shí)刻正在執(zhí)行的受害線程的線程標(biāo)識(shí)符。崩潰處理程序可以與操縱系統(tǒng)進(jìn)行交互以取回線程相關(guān)的信息,例如,在崩潰時(shí)刻的線程的棧指針以及指令指針。通過使用模塊函數(shù)映射來(lái)識(shí)別與該地址相對(duì)應(yīng)的函數(shù),從而崩潰處理程序可以使用指令指針來(lái)識(shí)別在崩潰時(shí)刻(即,當(dāng)出現(xiàn)相對(duì)應(yīng)的異常時(shí))正在執(zhí)行的函數(shù)。為了遍歷調(diào)用棧,崩潰處理程序使用該棧指針來(lái)取回指向下一較低棧幀的指針以及調(diào)用函數(shù)的返回地址。通過使用模塊函數(shù)映射,崩潰處理程序使用該返回地址來(lái)識(shí)別在崩潰的時(shí)刻正在執(zhí)行的函數(shù)。崩潰處理程序繼續(xù)遍歷該棧,直到它遇到棧的底部。棧的底部可以例如通過存儲(chǔ)在調(diào)用棧的底部幀(例如,引用SP==null)的區(qū)別于其他的值(例如,全1)來(lái)指定。在一些實(shí)施例中,崩潰處理程序可以以與生存更復(fù)雜的崩潰報(bào)告相似的形式來(lái)遍歷進(jìn)程的每一個(gè)線程的調(diào)用棧。
在一些實(shí)施例中,棧的底部可以不被崩潰處理程序容易地確定。例如,棧幀401可以包含引用SP的壞存儲(chǔ)地址,即,指向下一較低棧幀的指針正常存儲(chǔ)的位置。當(dāng)崩潰處理程序試圖使用該壞地址來(lái)訪問存儲(chǔ)器時(shí),壞地址異??赡馨l(fā)生。為了檢測(cè)遇到了調(diào)用棧的底部,崩潰處理程序可以安裝壞存儲(chǔ)訪問處理程序,當(dāng)試圖對(duì)壞存儲(chǔ)地址進(jìn)行引用時(shí),調(diào)用所述壞存儲(chǔ)訪問處理程序。壞存儲(chǔ)訪問處理程序可以簡(jiǎn)單地設(shè)置全局標(biāo)志來(lái)指示壞存儲(chǔ)訪問試圖,并且在試圖的存儲(chǔ)訪問之后,返回到崩潰處理程序來(lái)執(zhí)行指令。以下的指令可以查看全局標(biāo)志,并且使用其作為到達(dá)棧的底部的指示。
圖5是示出了在一些實(shí)施例中的用戶模式崩潰報(bào)告系統(tǒng)的組件的框圖。用戶崩潰報(bào)告系統(tǒng)500包括模塊數(shù)據(jù)510、數(shù)據(jù)結(jié)構(gòu)520、以及組件530。對(duì)于每一個(gè)模塊,模塊數(shù)據(jù)包括模塊511、符號(hào)表512、模塊函數(shù)映射513、以及免于負(fù)責(zé)的函數(shù)表514。模塊數(shù)據(jù)可以由開發(fā)者提供。符號(hào)表包含符號(hào)相關(guān)的信息,符號(hào)相關(guān)的信息可以用于使對(duì)函數(shù)和變量的引用符號(hào)化。免于負(fù)責(zé)的函數(shù)表可以被提供為存儲(chǔ)在應(yīng)用的配置文件中的配置信息。
由用戶模式崩潰報(bào)告系統(tǒng)使用的數(shù)據(jù)結(jié)構(gòu)包括調(diào)用棧521、調(diào)用鏈522、模塊表523、以及崩潰報(bào)告存儲(chǔ)524。在下文中,用戶模式崩潰報(bào)告系統(tǒng)在對(duì)崩潰的受害線程的處理的引用中描述。對(duì)崩潰的應(yīng)用的其他線程的處理將以與提供更復(fù)雜的崩潰報(bào)告類似的方式執(zhí)行。調(diào)用棧代表受害線程的調(diào)用棧。調(diào)用鏈代表由崩潰處理程序確定的函數(shù)調(diào)用的鏈。模塊表包含被加載到應(yīng)用的地址空間的模塊到其地址范圍的映射。崩潰報(bào)告庫(kù)存儲(chǔ)由用戶模式崩潰報(bào)告系統(tǒng)生成的崩潰報(bào)告。崩潰報(bào)告庫(kù)可以存儲(chǔ)每一個(gè)崩潰的崩潰報(bào)告直到其被更新到崩潰報(bào)告服務(wù)器并且可以永久地存儲(chǔ)關(guān)于崩潰的其他識(shí)別信息以對(duì)后續(xù)的崩潰報(bào)告的上傳進(jìn)行優(yōu)化。
用戶模式崩潰報(bào)告系統(tǒng)的組件包括崩潰處理程序531、用于調(diào)用鏈組件的添加函數(shù)532、查找負(fù)責(zé)的函數(shù)組件533、存儲(chǔ)崩潰報(bào)告組件534、添加模塊回調(diào)535、刪除模塊回調(diào)536、以及調(diào)用棧壞地址處理程序537??梢员话惭b來(lái)處理各種類型的崩潰的崩潰處理程序遍歷調(diào)用棧并且生成崩潰報(bào)告。用于調(diào)用鏈組件的添加函數(shù)識(shí)別與返回地址相關(guān)聯(lián)的函數(shù)并且將該函數(shù)的標(biāo)識(shí)符添加到調(diào)用鏈。查找負(fù)責(zé)函數(shù)組件識(shí)別對(duì)崩潰負(fù)責(zé)的函數(shù)。存儲(chǔ)崩潰報(bào)告組件控制崩潰報(bào)告的存儲(chǔ),以用于當(dāng)應(yīng)用下一次執(zhí)行時(shí)發(fā)送到崩潰報(bào)告服務(wù)器。添加模塊回調(diào)和刪除模塊回調(diào)在應(yīng)用被初始化為跟蹤被加載和卸載的模塊時(shí)被安裝。調(diào)用棧壞地址處理程序由崩潰處理程序安裝來(lái)處理由到達(dá)調(diào)用棧的底部引起的壞地址引用。
在其上可以實(shí)現(xiàn)用戶模式崩潰報(bào)告系統(tǒng)的計(jì)算設(shè)備和系統(tǒng)可以包括中央處理單元、輸入設(shè)備、輸出設(shè)備(例如,顯示設(shè)備和揚(yáng)聲器)、存儲(chǔ)設(shè)備(例如,存儲(chǔ)器和硬盤驅(qū)動(dòng))、網(wǎng)絡(luò)接口、圖形處理單元、加速度計(jì)、蜂窩無(wú)線鏈接接口、全球定位系統(tǒng)設(shè)備等。輸入設(shè)備可以包括鍵盤、定位設(shè)備、觸摸屏、姿勢(shì)識(shí)別設(shè)備(例如,對(duì)于空中手勢(shì))、頭部和眼部跟蹤設(shè)備、用于語(yǔ)音識(shí)別的麥克風(fēng)等。計(jì)算設(shè)備可以包括桌面計(jì)算機(jī)、膝上型計(jì)算機(jī)、平板計(jì)算機(jī)、電子閱讀器、個(gè)人數(shù)字助理、智能電話、游戲設(shè)備、服務(wù)器、以及計(jì)算機(jī)系統(tǒng),例如,大規(guī)模并行系統(tǒng)。計(jì)算系統(tǒng)可以訪問包括計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)和數(shù)據(jù)傳送介質(zhì)的計(jì)算機(jī)可讀介質(zhì)。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)是不包括暫時(shí)性、傳播信號(hào)的有形存儲(chǔ)單元。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)的示例包括存儲(chǔ)器,例如,主存儲(chǔ)器、高速緩存存儲(chǔ)器、以及輔助存儲(chǔ)器(例如,DVD),并且包括其他存儲(chǔ)單元。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以記錄在實(shí)現(xiàn)用戶模式崩潰報(bào)告系統(tǒng)的計(jì)算機(jī)可執(zhí)行指令或邏輯上或者可以利用實(shí)現(xiàn)用戶模式崩潰報(bào)告系統(tǒng)的計(jì)算機(jī)可執(zhí)行指令或邏輯進(jìn)行編碼。數(shù)據(jù)傳送介質(zhì)用于經(jīng)由暫時(shí)性、傳播信號(hào)或載波(例如,電磁)經(jīng)由有線或無(wú)線連接來(lái)傳送數(shù)據(jù)。
用戶模式崩潰報(bào)告系統(tǒng)可以在由一個(gè)或多個(gè)計(jì)算機(jī)、處理器或其它設(shè)備執(zhí)行的計(jì)算機(jī)可執(zhí)行指令(例如,程序模塊和部件)的通用上下文中描述。通常,程序模塊或組件包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定數(shù)據(jù)類型的例程、程序、對(duì)象、數(shù)據(jù)結(jié)構(gòu)等。典型地,程序模塊的功能如在各種實(shí)施例中所需要的可以進(jìn)行合并或者分布。用戶模式崩潰報(bào)告系統(tǒng)的方面可以使用例如專用集成電路(“ASIC”)在硬件中實(shí)現(xiàn)。
圖6是示出了在一些實(shí)施例中的崩潰處理程序的處理的流程圖。向崩潰處理程序600被傳遞有受害線程的指示、生成調(diào)用鏈、查找負(fù)責(zé)的函數(shù)、以及發(fā)送崩潰報(bào)告。在框601中,組件取回線程控制塊或與受害線程相關(guān)的其他信息。在框602,組件確定在崩潰時(shí)刻的指令指針。在框603,組件調(diào)用調(diào)用鏈組件的添加函數(shù)來(lái)將與指令指針相關(guān)聯(lián)的函數(shù)添加到調(diào)用鏈。在框604,組件取回在崩潰時(shí)刻的棧指針。在框605,組件安裝調(diào)用棧壞地址處理程序以用于檢測(cè)當(dāng)遍歷調(diào)用棧時(shí)何時(shí)遇到壞地址。在框606-609,組件循環(huán),遍歷調(diào)用棧。在框606,組件取回由當(dāng)前的棧指針引用的返回地址。如果棧指針SP指向壞存儲(chǔ)地址,則使用棧指針來(lái)訪問返回地址將導(dǎo)致壞地址異常。在判定框607,如果遇到棧幀的底部(例如,由指示壞地址異常的全局標(biāo)志所指示的),則組件在610繼續(xù),否則組件在框608繼續(xù)。在框608,組件調(diào)用調(diào)用鏈組件的添加函數(shù)、傳遞返回地址。在框609,組件取回對(duì)下一棧幀的引用,并且循環(huán)到框606來(lái)處理下一棧幀。在框610,組件調(diào)用查找負(fù)責(zé)的函數(shù)組件來(lái)識(shí)別對(duì)崩潰負(fù)責(zé)的函數(shù)。在框611,部件調(diào)用存儲(chǔ)崩潰報(bào)告組件,并且然后結(jié)束。
圖7是示出了在一些實(shí)施例中的崩潰報(bào)告系統(tǒng)的調(diào)用鏈組件的添加函數(shù)的處理的流程圖。向調(diào)用鏈組件的添加函數(shù)700傳遞地址,識(shí)別與該地址相對(duì)應(yīng)的模塊內(nèi)的函數(shù),并且將該函數(shù)添加到調(diào)用鏈。函數(shù)最初可以使用模塊表來(lái)識(shí)別模塊。在框701,組件選擇模塊函數(shù)映射中的下一條目。在判定框702,如果所有條目都已經(jīng)被選擇,則與傳遞的地址相對(duì)應(yīng)的函數(shù)沒有被找到,并且組件報(bào)告錯(cuò)誤,否則組件在框703繼續(xù)。在判定框703,如果地址在所選擇的條目的范圍內(nèi),則組件在框704繼續(xù),否則組件循環(huán)到框701,來(lái)選擇下一條目。在框704,組件將與識(shí)別出的函數(shù)相對(duì)應(yīng)的條目添加到調(diào)用鏈,并且然后返回。
圖8是示出了在一些實(shí)施例中的崩潰報(bào)告系統(tǒng)的查找負(fù)責(zé)的函數(shù)組件的處理的流程圖。查找負(fù)責(zé)的函數(shù)組件800處理調(diào)用鏈來(lái)識(shí)別對(duì)于崩潰負(fù)責(zé)的不免于負(fù)責(zé)的函數(shù)。在框801,組件選擇調(diào)用鏈中的下一函數(shù)。在判定框802,如果已經(jīng)到達(dá)調(diào)用鏈的結(jié)尾,則組件返回沒有識(shí)別到負(fù)責(zé)的函數(shù)的指示,否則組件在框803繼續(xù)。在判定框803,如果所選擇的函數(shù)是免于負(fù)責(zé)的,正如免于負(fù)責(zé)的函數(shù)表所指示的,則組件循環(huán)到框801來(lái)選擇下一函數(shù),否則組件返回所選擇的函數(shù)負(fù)責(zé)的指示。
圖9是示出了在一些實(shí)施例中的用戶模式崩潰報(bào)告系統(tǒng)的發(fā)送崩潰報(bào)告組件的處理的流程圖。存儲(chǔ)崩潰報(bào)告組件900被調(diào)用來(lái)發(fā)送崩潰報(bào)告。組件可以生成崩潰標(biāo)識(shí)符,并且存儲(chǔ)崩潰報(bào)告以用于當(dāng)應(yīng)用下一次啟動(dòng)時(shí),發(fā)送到崩潰報(bào)告服務(wù)器。組件可以使用崩潰標(biāo)識(shí)符來(lái)識(shí)別類似的崩潰是否已經(jīng)報(bào)告過。在框901,組件生成崩潰標(biāo)識(shí)符,例如,應(yīng)用名稱和其版本、負(fù)責(zé)的模塊名稱(即,包含負(fù)責(zé)的函數(shù)的模塊)和其版本、以及負(fù)責(zé)的模塊內(nèi)的崩潰偏移的組合。在框902,組件收集各種崩潰報(bào)告信息,其可以包括每一個(gè)線程的調(diào)用鏈、負(fù)責(zé)的函數(shù)、變量的符號(hào)和函數(shù)(例如,負(fù)責(zé)的函數(shù))名稱、應(yīng)用的地址空間的各個(gè)部分的轉(zhuǎn)儲(chǔ)等。在框903,組件將會(huì)話標(biāo)識(shí)符添加到崩潰報(bào)告。會(huì)話標(biāo)識(shí)符唯一地識(shí)別從開始到結(jié)束(例如,崩潰或正常結(jié)束)的應(yīng)用的異常。在某環(huán)境中,應(yīng)用(或應(yīng)用監(jiān)視器)可以向服務(wù)器(例如,客戶體驗(yàn)服務(wù)器)報(bào)告應(yīng)用的活動(dòng)或其它信息,并且由會(huì)話標(biāo)識(shí)符識(shí)別該活動(dòng)。崩潰報(bào)告中的會(huì)話標(biāo)識(shí)符的使用允許活動(dòng)信息與崩潰報(bào)告相關(guān)。以這種方式,當(dāng)分析崩潰的原因時(shí),開發(fā)者能夠利用具有崩潰報(bào)告和活動(dòng)信息二者。在框904,組件將崩潰報(bào)告添加到崩潰報(bào)告存儲(chǔ)庫(kù),并且然后返回。當(dāng)應(yīng)用下一次執(zhí)行時(shí),如果上傳標(biāo)準(zhǔn)滿足,則應(yīng)用將崩潰報(bào)告上傳到崩潰報(bào)告服務(wù)器。應(yīng)用可以使用各種上傳標(biāo)準(zhǔn)來(lái)確定崩潰報(bào)告是否應(yīng)該被上傳。例如,上傳標(biāo)準(zhǔn)可以基于當(dāng)前的通信帶寬(例如,蜂窩與WiFi),一些數(shù)量的相同類型的崩潰報(bào)告是否已經(jīng)被上傳等等。
圖10是示出了在一些實(shí)施例中的用戶模式崩潰報(bào)告系統(tǒng)的添加模塊回調(diào)組件的處理的流程圖。添加模塊回調(diào)組件1000在用戶模式崩潰報(bào)告系統(tǒng)初始化時(shí)被安裝,并且記錄其圖像已經(jīng)被加載到應(yīng)用的地址空間的這些模塊。應(yīng)用環(huán)境可以調(diào)用傳遞模塊標(biāo)識(shí)符的指示的添加模塊回調(diào),以通知應(yīng)用模塊已經(jīng)被加載。在框1001-1003,組件可以取回關(guān)于已經(jīng)加載的模塊的各種信息,例如,其存儲(chǔ)器中的地址、其名稱、其構(gòu)建標(biāo)識(shí)符等。在框1004,組件將條目添加到模塊表,并且然后完成。
雖然以具體到結(jié)構(gòu)特征和/或動(dòng)作的語(yǔ)言描述了本主題,但是應(yīng)當(dāng)理解的是,在隨附的權(quán)利要求中限定的主題不一定被限制為上述的具體特征或動(dòng)作。而是,上述的具體的特征和動(dòng)作被公開作為實(shí)現(xiàn)權(quán)利要求的示例形式。相應(yīng)地,本發(fā)明只由隨附的權(quán)利要求來(lái)進(jìn)行限定。