應用程序的信息處理方法和裝置的制造方法
【專利摘要】本發明公開了一種應用程序的信息處理方法和裝置。其中,該方法包括:根據本發明實施例的一個方面,提供了一種應用程序的信息處理方法,該信息處理方法包括:檢測當前運行的應用程序是否出現異常;在檢測到應用程序出現異常的情況下,獲取應用程序在運行的過程中已開始執行的任務的信息,其中,已開始執行的任務的信息用于對異常進行定位;將已開始執行的任務的信息發送至應用程序的服務器。本發明解決了在程序發生crash時,無法準確定位crash原因的技術問題。
【專利說明】
應用程序的信息處理方法和裝置
技術領域
[0001]本發明涉及計算機領域,具體而言,涉及一種應用程序的信息處理方法和裝置。
【背景技術】
[0002]現有的安卓Andoid開發IDE(即android stud1)在斷點調試時,可以查看當前的函數調用棧;產品外發版本發生crash(即,程序崩潰)時,現有的程序崩潰上報平臺也可以上報程序發生崩潰時的函數調用棧,程序開發根據上報的調用棧內容可以定位程序發生崩潰的原因,并基于該定位的原因做修正。
[0003]圖1示出了現有技術中的多線程環境的數據結構,如圖1所示,現有技術方案中,一個進程中可以包括多個線程,如圖1示出的線程A和線程B,線程A中包括任務隊列,線程B中也包括一個任務隊列,如果在應用程序執行任務的過程中,線程A中拋一個異步任務Tl到線程B中執行,則該異步任務Tl會先添加到線程B的任務隊列中,線程B會按順序從隊列中去獲取任務,并一一執行。采用該方案,如果在線程B中執行任務時發生crash,則程序只能獲取到在線程B中的函數調用堆棧,并將該線程B中的函數調用堆棧上報至crash上報平臺。
[0004]由上可知,不管是現有的IDE或者現有的crash上報平臺,在程序執行任務過程中發生crash時都只能獲取當前線程的調用棧。如果外發版本crash在一個子線程,則獲取該子線程的函數調用棧,而無法追溯之前線程的調用棧。由于觸發一個操作的起因很多,若程序執行該操作時發生crash,只能獲取當前線程的函數調用棧,無法還原用戶的使用場景,無法獲知觸發該操作的起因,因此也無法定位發生crash的真正原因。
[0005]針對上述在程序發生crash時,無法準確定位crash原因的問題,目前尚未提出有效的解決方案。
【發明內容】
[0006]本發明實施例提供了一種應用程序的信息處理方法和裝置,以至少解決在程序發生crash時,無法準確定位crash原因的技術問題。
[0007]根據本發明實施例的一個方面,提供了一種應用程序的信息處理方法,該信息處理方法包括:檢測當前運行的應用程序是否出現異常;在檢測到應用程序出現異常的情況下,獲取應用程序在運行的過程中已開始執行的任務的信息,其中,已開始執行的任務的信息用于對異常進行定位;將已開始執行的任務的信息發送至應用程序的服務器。
[0008]根據本發明實施例的另一方面,還提供了一種應用程序的信息處理裝置,該信息處理裝置包括:檢測單元,用于檢測當前運行的應用程序是否出現異常;第一獲取單元,用于在檢測到應用程序出現異常的情況下,獲取應用程序在運行的過程中已開始執行的任務的信息,其中,已開始執行的任務的信息用于對異常進行定位;發送單元,用于將已開始執行的任務的信息發送至應用程序的服務器。
[0009]在本發明實施例中,若當前運行的應用程序發生異常,則獲取已開始執行的任務的信息,并將獲取的已開始執行的任務的信息發送至應用程序的服務器,從而可以在程序發生crash時,獲取已開始執行的所有程序任務的函數調用信息,以獲取完整的各個線程的堆棧信息,服務器在獲取完整的堆棧信息之后,可以還原程序發生crash的場景,從而可以準確定位程序發生crash的原因,解決了現有技術中在程序發生crash時,無法準確定位crash原因的問題。
【附圖說明】
[0010]此處所說明的附圖用來提供對本發明的進一步理解,構成本申請的一部分,本發明的示意性實施例及其說明用于解釋本發明,并不構成對本發明的不當限定。在附圖中:
[0011]圖1是根據現有技術的一種多線程環境的數據結構的示意圖;
[0012]圖2是根據本發明實施例的一種可選的網絡環境的示意圖;
[0013]圖3是根據本發明實施例的一種可選的應用程序的信息處理方法的流程圖;
[0014]圖4是根據本發明實施例的一種多線程環境的數據結構的示意圖;
[0015]圖5是根據本發明實施例的另一種可選的應用程序的信息處理方法的流程圖;
[0016]圖6是根據本發明實施例的再一種可選的應用程序的信息處理方法的流程圖;
[0017]圖7是根據現有技術中的crash上報內容的示意圖;
[0018]圖8是根據本發明實施例的crash上報內容的示意圖;
[0019]圖9是根據本發明實施例的應用程序的信息處理裝置的示意圖;
[0020]圖10是根據本發明實施例的計算機終端的結構框圖。
【具體實施方式】
[0021]為了使本技術領域的人員更好地理解本發明方案,下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分的實施例,而不是全部的實施例。基于本發明中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都應當屬于本發明保護的范圍。
[0022]需要說明的是,本發明的說明書和權利要求書及上述附圖中的術語“第一”、“第二”等是用于區別類似的對象,而不必用于描述特定的順序或先后次序。應該理解這樣使用的數據在適當情況下可以互換,以便這里描述的本發明的實施例能夠以除了在這里圖示或描述的那些以外的順序實施。此外,術語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統、產品或設備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或對于這些過程、方法、產品或設備固有的其它步驟或單元。
[0023]首先,對本申請涉及的術語解釋如下:
[0024]函數調用堆棧(callstack):在計算機領域,函數調用堆棧是一個存儲方法列表的數據結構,其中按調用順序保存了所有在運行期間被調用的方法。在程序crash時,或者在調試程序時,可以獲取當前的函數調用堆棧。
[0025]線程本地存儲(TLS):在進程中,所有線程是共享地址空間的,對于一個全局變量或者是靜態變量,所有線程訪問的都是同一份,如果某個線程對其進行了修改,就會影響到其他所有的線程,針對這種情況,計算機操作系統提供了線程本地存儲功能(TLS),其作用是將數據和特定的線程聯系起來,各個線程訪問和修改自己的數據不互相影響。
[0026]Crash,在計算機系統壓力或性能測試過程中,有時出現因某種原因宕機,或主機、程序停止工作、停止響應、進程中斷等情況,如程序崩潰等。
[0027]實施例1
[0028]根據本發明實施例,提供了一種無線網絡信息的處理方法的實施例,需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執行指令的計算機系統中執行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執行所示出或描述的步驟。
[0029]可選地,在本實施例中,上述無線網絡信息的處理方法以應用于如圖2所示的網絡環境中。該網絡環境包括終端201和服務器203(該服務器可以為網絡連接應用的服務器或云平臺),其中,終端可以與服務器通過網絡建立連接,終端和服務器上均可以設置處理器。
[0030]上述網絡包括但不限于:廣域網、城域網或局域網。優選地,上述的網絡為局域網;上述終端可以包括個人計算機,可選地,該終端為移動終端(如手機、平板電腦等)。
[0031]圖3是根據本發明實施例的應用程序的信息處理方法的流程圖,如圖3所示,該方法包括如下步驟:
[0032]步驟S301:檢測當前運行的應用程序是否出現異常;
[0033]步驟S303:在檢測到應用程序出現異常的情況下,獲取應用程序在運行的過程中已開始執行的任務的信息,其中,已開始執行的任務的信息用于對異常進行定位;
[0034]步驟S305:將已開始執行的任務的信息發送至應用程序的服務器。
[0035]采用本發明的上述實施例,若當前運行的應用程序發生異常,則獲取已開始執行的任務的信息,并將獲取的已開始執行的任務的信息發送至應用程序的服務器,從而可以在程序發生crash時,獲取已開始執行的所有程序任務的函數調用信息,以獲取完整的各個線程的堆棧信息,服務器在獲取完整的堆棧信息之后,可以還原程序發生crash的場景,從而可以準確定位程序發生crash的原因,解決了現有技術中在程序發生crash時,無法準確定位crash原因的問題。
[0036]上述實施例的步驟S301中,安裝有應用程序的終端的處理器在啟動該應用程序之后,該終端的處理器中的執行器執行該應用程序的任務,以運行該應用程序的功能,具體地,處理器在執行應用程序的任務的過程中,可以實時檢測該應用程序是否發生異常,即,檢測該應用程序是否發生crash,如,檢測應用程序是否停止工作、停止響應、進程中斷等。
[0037]若檢測出該應用程序發生crash,處理器獲取已開始執行的所有任務的函數調用信息,該函數調用信息可以定位異常發生的位置和原因,將該函數調用信息上報到應用程序的服務器(如crash平臺),開發者在獲取到該函數調用信息之后,可以通過還原后的信息分析crash的原因。
[0038]可選地,該終端可以為安裝有安卓操作系統的終端,當檢測到程序在執行某個任務出現crash時,可以按照以下步驟還原出完整的調用堆棧:先通過安卓平臺(即Android平臺)提供的Throwable類對象,獲取出上述的函數調用信息,將獲取到的函數調用信息上報至IJcrash平臺,這樣開發就可以通過還原后的完整的信息來分析crash原因了。
[0039]Throwable類是java語音中所有錯誤或異常的超類,該類中的信息通常用于指示發生了異常情況,可選地,該Throwable類的實例是在異常情況的上下文中新近創建的,該Throwab I e類對象中包含了異常的相關信息,如堆棧跟蹤數據。
[0040]上述實施例中,對異常進行定位具體是指,在發生異常時,獲取的已開始執行的任務的信息中可以看到程序的堆棧信息,在該堆棧信息中可以看到在哪個類、哪個函數中出的錯,若無法確定在哪個類、哪個函數出的錯,可以重新執行一次上述的已開始執行的任務中觸發異常的任務入口,以定位出發生異常的任務入口、異常發生的原因等。在定位該異常之后,可以基于定位的該異常的原因、位置等信息,對應用程序的源代碼進行修正,以修復該異常。
[0041]根據本發明的上述實施例,獲取應用程序在運行的過程中已開始執行的任務的信息可以包括:獲取用于執行已開始執行的任務的所有線程的函數調用信息,其中,已開始執行的任務的信息包括函數調用信息。
[0042]在上述實施例中,上述的已開始執行的任務可以包括同步任務,也可以包括異步任務。在已開始執行的任務包括同步任務的情況下,除發生異常時執行的任務外,其余的已開始執行的同步任務均已完成;在已開始執行的任務包括異步任務的情況下,已經開始執行的異步任務均可能未完成,換句話說,均可能處于當前執行的狀態。
[0043]上述實施例中的所有線程包括所有執行過或正在執行所述已開始執行的任務的線程,如,該線程包括發生異常的線程和向該發生異常的線程發起異步任務的線程。
[0044]函數調用信息中記錄了函數調用的順序,每調用一次函數對應執行一個任務。
[0045]通過上述實施例,能夠還原多線程環境下異步函數調用堆棧,當外發產品crash時能夠獲取到還原后的各個線程的完整的堆棧信息,從而幫助定位crash的原因。
[0046]下面以異步任務為例,對上述實施例進行解釋說明。可以使用異步任務執行模塊執行上述的已開始執行的任務,具體地,產品程序底層提供統一的異步任務執行模塊XTask,所有的異步任務都通過Xtask提供的post接口來發起,在發起異步任務時,一并將該線程中所有的函數調用堆棧信息發送至執行異步任務的線程,當任務真正執行時,將暫存的堆棧信息列表寫入到當前線程中,當任務執行時發生craSh,XTask模塊就可以從當前線程中獲取出之前的所有堆棧信息列表(即上述實施例中的函數調用信息),并做上報。
[0047]具體地,獲取用于執行已開始執行的任務的所有線程的函數調用信息可以包括:獲取出現異常的第一線程的第一函數調用堆棧信息;從第一線程的線程本地存儲單元中,獲取預先保存的第二線程的第二函數調用堆棧信息,其中,第二線程為向第一線程發起異步任務的線程,函數調用信息包括第一函數調用堆棧信息和第二函數調用堆棧信息,所有線程包括第一線程和第二線程。
[0048]其中,出現異常的第一線程即為發生異常的任務所在的線程。
[0049]在上述實施例中,在應用程序開始運行之后,檢測當前運行的應用程序是否出現異常,在檢測到應用程序出現異常的情況下,通過終端的操作系統提供的異常類對象,獲取出現異常的第一線程的第一函數調用堆棧信息,并從第一線程的線程本地存儲單元中,取出預先保存的之前的所有線程的第二函數調用堆棧信息,將該第一函數調用堆棧信息和第二函數調用堆棧信息組合起來,上報到crash平臺(即上述實施例中的服務器),服務器側可以通過該組合的函數調用信息分析異常發生的原因,以定位該異常。
[0050]在本發明的上述實施例中,采用了不同于圖1所示的數據結構,如圖4所示,在多線程異步函數調用堆棧的場景中,每個線程都設置有一個任務隊列和線程本地存儲單元TLS,其中的任務隊列用于保存該線程待執行的任務,在線程本地存儲單元TLS中存儲之前所有的調用堆棧信息列表。
[0051 ]下面以異步任務為例,詳述本發明上述實施例:
[0052]通過異步任務執行模塊XTask提供的post接口來發起,XTask模塊在發起異步任務之前,將獲取出之前所有的調用堆棧信息列表,將其暫存到異步任務對象中,當任務真正執行時,將暫存的堆桟信息列表寫入到當前線程的TLS中,當任務執行時發生crash,XTask模塊就可以從TLS中獲取出之前的所有堆棧信息列表(即上述實施例中的函數調用信息),并上報該堆棧信息列表,從而可以確定該堆棧信息列表定位異常原因。
[0053]可選地,已開始執行的任務包括:在發生異常前開始執行并且執行完成的任務和在發生異常前開始執行但尚未執行完成的任務(即正在執行的任務)。
[0054]對于同步任務來講,一個任務完成才執行下一個任務,因此,若已開始執行的任務為同步任務,則該已開始執行的任務包括已經執行完成的任務和當前執行的發生異常的任務。
[0055]對于異步任務來講,不會等一個任務完成才執行下一個任務,因此,若已開始執行的任務為異步任務,則該已開始執行的任務包括已經執行完成的任務、未執行完成的任務和發生異常的當前執行的任務。
[0056]需要進一步說明的是,在應用程序運行的過程中,方法還可以包括:在第二線程向第一線程發起異步任務之前,獲取第二線程的第二函數調用堆棧信息;在第一線程執行異步任務之前,將第二函數調用堆棧信息保存在第一線程的線程本地存儲單元中,其中,已開始執行的任務包括異步任務。
[0057]通過上述方案,可以按照順序保存下所有線程的堆棧信息,當程序在執行某個任務出現crash時,可以按照上述實施例中獲取函數調用信息的方案還原出完整的調用堆棧。
[0058]具體地,在第二線程拋出異步任務之前,獲取第二函數調用堆棧信息,并將該第二函數調用堆棧信息傳遞給第一線程,第一線程將該第二函數調用堆棧信息保存在第一線程的線程本地存儲單元中。
[0059]可選地,在檢測出應用程序出現異常時,則可以獲取第一線程的第一函數調用堆棧信息,并從第一線程的線程本地存儲單元中,獲取預先保存的第二線程的第二函數調用堆棧信息,利用第一函數調用堆棧信息和第二函數調用堆棧信息的組合信息定位異常。
[0060]具體地,獲取第二線程的第二函數調用堆棧信息可以包括:獲取第二線程的當前函數調用堆棧信息;從第二線程的線程本地存儲單元中,讀取預先保存的前序線程的函數調用堆棧信息;將當前函數調用堆棧信息和前序線程的函數調用堆棧信息作為第二函數調用堆棧信息,其中,前序線程為在第二線程執行已開始執行的任務之前執行已開始執行的任務的線程。
[0061]在該實施例中,將在第二線程執行任務之前的線程稱之為第二線程的前序線程,前序線程向第二線程發起異步任務時,將前序線程中當前的函數調用堆棧信息和在線程本地存儲單元中保存的函數調用堆棧信息發送至第二線程;第二線程在發起異步任務之前,獲取第二線程的當前函數調用堆棧信息,并從第二線程的線程本地存儲單元中預存的前序線程發送的函數調用堆棧信息(即在該異步任務之前執行的所有任務的函數調用堆棧信息),將該當前函數調用堆棧信息和前序線程的函數調用堆棧信息發送至第一線程,以便于在應用程序發送crash時,調用該函數調用信息。
[0062]在上述實施例中,第二線程即為第一線程的前序線程,第一線程即為第二線程的后序線程。
[0063]依次類推,每個線程發起異步任務之前,均獲取該線程中的所有的函數調用信息,并將獲取的所有的函數調用信息發送至后序線程,以便后序線程在執行任務的過程中發生crash時,調用任務信息,以還原任務場景,定位異常。
[0064]上述實施例中,將第二函數調用堆棧信息保存在第一線程的線程本地存儲單元中可以包括:將第二函數調用堆棧信息存儲在異步任務的對象中;將異步任務的對象發送至第一線程的任務隊列;在執行異步任務之前,從異步任務的對象中讀取第二函數調用堆棧信息,并將第二函數調用堆棧信息保存在第一線程的線程本地存儲單元中。
[0065]具體地,在將第二函數調用堆棧信息保存在第一線程的線程本地存儲單元中之后,方法還可以包括:執行異步任務,在執行完成異步任務之后,清空第一線程的線程本地存儲單元。
[0066]如圖4所示,應用進程中每個線程都會有一個任務隊列和一個線程本地存儲單元TLS,該TLS用于存儲函數調用信息。如圖1所示,現有技術中的應用進程中每個線程僅有一個任務隊列,如果在線程A中拋一個異步任務Tl到線程B中執行,則Tl會先添加到線程B的任務隊列中。線程B會按順序從隊列中去獲取任務,并--執行。如果在線程B中執行任務發生
crash,則只能獲取到在線程B中的函數調用堆棧,不能知道在線程A中的函數調用堆棧。
[0067]而如圖4所示的實施例中,為每個線程增加了TLS數據結構,該數據結構用來存儲之前所有線程的函數調用堆棧。
[0068]下面結合圖4和圖5,以在線程A中拋出一個異步任務到線程B執行為例,詳細描述整個函數調用堆棧信息的存儲過程:
[0069]步驟S501:確定線程A中的待執彳丁任務為異步任務Tl。
[0070]步驟S502:獲取在該異步任務Tl之前已開始執行的所有任務的信息。
[0071]具體地,在線程A拋出該異步任務Tl之前,會先通過操作系統提供的異常類對象獲取到當前線程A的函數調用堆棧Sl(即上述實施例中的當前函數調用堆棧信息),接著從當前線程A的TLS中取出存儲的前序線程的所有的函數調用堆棧信息S2,將當前函數調用堆棧信息SI和前序程序的所有函數調用堆棧信息S2的內容組合起來得到堆棧信息S(即上述實施例中的第二函數調用堆棧信息),暫存在異步任務Tl的對象中。
[0072]安裝有該應用程序的終端可以使用安卓操作系統、1S操作系統、windows操作系統等,本發明對此不做限定,對應安卓操作系統來講,安卓操作系統提供的異常類對象為:Throwab Ie 對象;
[0073]步驟S503:通過系統的接口,將異步任務Tl的對象發送到線程B的任務隊列。
[0074]步驟S504:在線程B中獲取異步任務Tl的對象。
[0075]步驟S505:從異步任務Tl的對象中取出堆棧信息S。
[0076]具體地,在異步任務Tl真正執行之前,先取出存儲的堆棧信息S的內容,并將其存儲到線程B的TLS中。
[0077]步驟S506:執行異步任務Tl。
[0078]步驟S507:在執行完成異步任務Tl后將TLS清空。
[0079]上述實施例中的線程A與第二線程相對應,線程B與第一線程相對應。
[0080]通過以上步驟,就可以按順序保存下所有線程的堆棧信息,當程序在執行某個任務出現crash時,可以按照如圖6所示的步驟還原出完整的調用堆棧:
[0081]步驟S601:獲取當前線程的第一函數調用堆棧信息。
[°082 ] 具體地,可以先通過Andro i d平臺提供的Throwab I e對象,獲取出當前的函數調用堆棧信息,此處的當前線程對應上述實施例中的第一線程。
[0083]步驟S603:從當前線程的TLS中獲取出保存的之前的所有線程的函數調用堆棧信息。此實施例中的之前的所有線程的函數調用堆棧信息對應上述的第二函數調用堆棧信息。
[0084]步驟S605:將第一函數調用堆棧信息和第二函數調用堆棧信息上報至crash平臺。
[0085]具體地,可以將以上兩種信息組合起來,上報到crash平臺,這樣開發就可以通過還原后的完整的信息來分析crash原因了。
[0086]圖7是采用現有技術中的方案上報的函數調用信息,圖8是采用本發明的方案上報的函數調用信息。
[0087]如圖7所示,采用現有技術中的方案,若在某個線程crash了,上報內容中只能看到少量的堆桟信息,如,在圖7中不出的 “ODDataReportMgr.reportData(ReportRequest)line: 112”,從該結果中可以看出哪一個任務執行異常,也可以得知該任務的位置,但是由于觸發該任務的場景很多,具體導致該任務執行異常的發生原因則無法確定。
[0088]如圖8所示,采用本發明的上述方案,上報的內容中可以看到完整的程序執行的函數調用堆棧信息,如可以看到發生異常任務的來源,也即圖中示出的某個異常的“Entry”,可以從該信息中準確確定該發生異常的任務的來源是哪里,從而可以縮小異常發生原因的排查范圍,從而可以基于該范圍采用重新執行該任務、或者重現場景的方式,檢查代碼邏輯,修正任務處理邏輯。
[0089]在上述實施例中,通過TLS,ThrOTable還原出多線程環境下完整的異步函數調用堆棧信息;并且在產品外發版本crash時,將還原后的堆棧信息上報crash平臺,可以準確完整還原任務操作場景,以快速、準確定位異常。
[0090]需要說明的是,對于前述的各方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領域技術人員應該知悉,本發明并不受所描述的動作順序的限制,因為依據本發明,某些步驟可以采用其他順序或者同時進行。其次,本領域技術人員也應該知悉,說明書中所描述的實施例均屬于優選實施例,所涉及的動作和模塊并不一定是本發明所必須的。
[0091]通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到根據上述實施例的方法可借助軟件加必需的通用硬件平臺的方式來實現,當然也可以通過硬件,但很多情況下前者是更佳的實施方式。基于這樣的理解,本發明的技術方案本質上或者說對現有技術做出貢獻的部分可以以軟件產品的形式體現出來,該計算機軟件產品存儲在一個存儲介質(如R0M/RAM、磁碟、光盤)中,包括若干指令用以使得一臺終端設備(可以是手機,計算機,服務器,或者網絡設備等)執行本發明各個實施例所述的方法。
[0092]實施例2
[0093]根據本發明實施例,還提供了一種用于實施上述應用程序的信息處理裝置,如圖9所示,該裝置包括:
[0094]檢測單元91,用于檢測當前運行的應用程序是否出現異常;
[0095]第一獲取單元93,用于在檢測到應用程序出現異常的情況下,獲取應用程序在運行的過程中已開始執行的任務的信息,其中,已開始執行的任務的信息用于對異常進行定位;
[0096]發送單元95,用于將已開始執行的任務的信息發送至應用程序的服務器。
[0097]采用本發明的上述實施例,若當前運行的應用程序發生異常,則獲取已開始執行的任務的信息,并將獲取的已開始執行的任務的信息發送至應用程序的服務器,從而可以在程序發生crash時,獲取已開始執行的所有程序任務的函數調用信息,以獲取完整的各個線程的堆棧信息,服務器在獲取完整的堆棧信息之后,可以還原程序發生crash的場景,從而可以準確定位程序發生crash的原因,解決了現有技術中在程序發生crash時,無法準確定位crash原因的問題。
[0098]上述實施例中,安裝有應用程序的終端的處理器在啟動該應用程序之后,該終端的處理器中的執行器執行該應用程序的任務,以運行該應用程序的功能,具體地,處理器在執行應用程序的任務的過程中,可以實時檢測該應用程序是否發生異常,即,檢測該應用程序是否發生crash,如,檢測應用程序是否停止工作、停止響應、進程中斷等。
[0099]若檢測出該應用程序發生crash,處理器獲取已開始執行的所有任務的函數調用信息,該函數調用信息可以定位異常發生的位置和原因,將該函數調用信息上報到應用程序的服務器(如crash平臺),開發者在獲取到該函數調用信息之后,可以通過還原后的信息分析crash的原因。
[0100]可選地,該終端可以為安裝有安卓操作系統的終端,當檢測到程序在執行某個任務出現crash時,可以按照以下步驟還原出完整的調用堆棧:先通過安卓平臺(即Android平臺)提供的Throwable類對象,獲取出上述的函數調用信息,將獲取到的函數調用信息上報至IJcrash平臺,這樣開發就可以通過還原后的完整的信息來分析crash原因了。
[0101]Throwable類是java語音中所有錯誤或異常的超類,該類中的信息通常用于指示發生了異常情況,可選地,該Throwable類的實例是在異常情況的上下文中新近創建的,該Throwab I e類對象中包含了異常的相關信息,如堆棧跟蹤數據。
[0102]上述實施例中,對異常進行定位具體是指,在發生異常時,獲取的已開始執行的任務的信息中可以看到程序的堆棧信息,在該堆棧信息中可以看到在哪個類、哪個函數中出的錯,若無法確定在哪個類、哪個函數出的錯,可以重新執行一次上述的已開始執行的任務中觸發異常的任務入口,以定位出發生異常的任務入口、異常發生的原因等。在定位該異常之后,可以基于定位的該異常的原因、位置等信息,對應用程序的源代碼進行修正,以修復該異常。
[0103]進一步地,獲取單元包括:第一獲取子單元,用于獲取用于執行已開始執行的任務的所有線程的函數調用信息,其中,已開始執行的任務的信息包括函數調用信息。
[0104]上述實施例中的所有線程包括所有執行過或正在執行所述已開始執行的任務的線程,如,該線程包括發生異常的線程和向該發生異常的線程發起異步任務的線程。
[0105]函數調用信息中記錄了函數調用的順序,每調用一次函數對應執行一個任務。
[0106]通過上述實施例,能夠還原多線程環境下異步函數調用堆棧,當外發產品crash時能夠獲取到還原后的各個線程的完整的堆棧信息,從而幫助定位crash的原因。
[0107]具體地,獲取子單元可以包括:第一獲取模塊,用于獲取出現異常的第一線程的第一函數調用堆棧信息;第二獲取模塊,用于從第一線程的線程本地存儲單元中,獲取預先保存的第二線程的第二函數調用堆棧信息,其中,第二線程為向第一線程發起異步任務的線程,函數調用信息包括第一函數調用堆棧信息和第二函數調用堆棧信息,所有線程包括第一線程和第二線程。
[0108]其中,出現異常的第一線程即為發生異常的任務所在的線程。
[0109]在上述實施例中,在應用程序開始運行之后,檢測當前運行的應用程序是否出現異常,在檢測到應用程序出現異常的情況下,通過終端的操作系統提供的異常類對象,獲取出現異常的第一線程的第一函數調用堆棧信息,并從第一線程的線程本地存儲單元中,取出預先保存的之前的所有線程的第二函數調用堆棧信息,將該第一函數調用堆棧信息和第二函數調用堆棧信息組合起來,上報到crash平臺(即上述實施例中的服務器),服務器側可以通過該組合的函數調用信息分析異常發生的原因,以定位該異常。
[0110]根據本發明的上述實施例,已開始執行的任務包括:在發生異常前開始執行并且執行完成的任務和在發生異常如開始執彳丁但尚未執彳丁完成的任務。
[0111]需要說明的是,裝置還可以包括:第二獲取單元,用于在應用程序運行的過程中,在第二線程向第一線程發起異步任務之前,獲取第二線程的第二函數調用堆棧信息;第一保存單元,用于在第一線程執行異步任務之前,將第二函數調用堆棧信息保存在第一線程的線程本地存儲單元中,其中,已開始執行的任務包括異步任務。
[0112]通過上述方案,可以按照順序保存下所有線程的堆棧信息,當程序在執行某個任務出現crash時,可以按照上述實施例中獲取函數調用信息的方案還原出完整的調用堆棧。
[0113]在上述實施例中,第二獲取單元可以包括:第二獲取子單元,用于獲取第二線程的當前函數調用堆棧信息;讀取子單元,用于從第二線程的線程本地存儲單元中,讀取預先保存的前序線程的函數調用堆棧信息;確定子單元,用于將當前函數調用堆棧信息和前序線程的函數調用堆棧信息作為第二函數調用堆棧信息,其中,前序線程為在第二線程執行已開始執行的任務之前執行已開始執行的任務的線程。
[0114]可選地,在檢測出應用程序出現異常時,則可以獲取第一線程的第一函數調用堆棧信息,并從第一線程的線程本地存儲單元中,獲取預先保存的第二線程的第二函數調用堆棧信息,利用第一函數調用堆棧信息和第二函數調用堆棧信息的組合信息定位異常。
[0115]在一個可選的實施例中,保存單元可以包括:存儲子單元,用于將第二函數調用堆棧信息存儲在異步任務的對象中;發送子單元,用于將異步任務的對象發送至第一線程的任務隊列;讀取保存子單元,用于在執行異步任務之前,從異步任務的對象中讀取第二函數調用堆棧信息,并將第二函數調用堆棧信息保存在第一線程的線程本地存儲單元中。
[0116]具體地,裝置還可以包括:處理單元,用于在將第二函數調用堆棧信息保存在第一線程的線程本地存儲單元中之后,執行異步任務,在執行完成異步任務之后,清空第一線程的線程本地存儲單元。
[0117]通過上述實施例,通過異步任務執行模塊XTask提供的post接口來發起異步任務,XTask模塊在發起異步任務之前,將獲取出之前所有的調用堆棧信息列表,將其暫存到異步任務對象中,當任務真正執行時,將暫存的堆棧信息列表寫入到當前線程的TLS中,當任務執行時發生crash,XTask模塊就可以從TLS中獲取出之前的所有堆棧信息列表,并做上報。通過上述方案可以還原多線程環境下異步函數調用堆棧,當外發產品crash時能夠獲取到還原后的各個線程的完整的堆棧信息,從而幫助定位crash的原因。
[0118]本實施例中所提供的各個模塊與方法實施例對應步驟所提供的使用方法相同、應用場景也可以相同。當然,需要注意的是,上述模塊涉及的方案可以不限于上述實施例中的內容和場景,且上述模塊可以運行在計算機終端或移動終端,可以通過軟件或硬件實現。
[0119]實施例3
[0120]根據本發明實施例,還提供了一種用于實施上述應用程序的信息處理方法的服務器,如圖1O所示,該服務器包括:
[0121]如圖10所示,該服務器或終端包括:一個或多個(圖中僅示出一個)處理器1001、存儲器1003、以及傳輸裝置1005(如上述實施例中的發送裝置),如圖10所示,該終端還可以包括輸入輸出設備1007。
[0122]其中,存儲器1003可用于存儲軟件程序以及模塊,如本發明實施例中的應用程序的信息處理方法和裝置對應的程序指令/模塊,處理器1001通過運行存儲在存儲器1003內的軟件程序以及模塊,從而執行各種功能應用以及數據處理,即實現上述的應用程序的信息處理方法。存儲器1003可包括高速隨機存儲器,還可以包括非易失性存儲器,如一個或者多個磁性存儲裝置、閃存、或者其他非易失性固態存儲器。在一些實例中,存儲器1003可進一步包括相對于處理器1001遠程設置的存儲器,這些遠程存儲器可以通過網絡連接至終端。上述網絡的實例包括但不限于互聯網、企業內部網、局域網、移動通信網及其組合。
[0123]上述的傳輸裝置1005用于經由一個網絡接收或者發送數據,還可以用于處理器與存儲器之間的數據傳輸。上述的網絡具體實例可包括有線網絡及無線網絡。在一個實例中,傳輸裝置1005包括一個網絡適配器(Network Interface Controller,NIC),其可通過網線與其他網絡設備與路由器相連從而可與互聯網或局域網進行通訊。在一個實例中,傳輸裝置1005為射頻(Rad1 Frequency,RF)模塊,其用于通過無線方式與互聯網進行通訊。
[0124]其中,具體地,存儲器1003用于存儲應用程序。
[0125]處理器1001可以通過傳輸裝置1005調用存儲器1003存儲的應用程序,以執行下述步驟:
[0126]步驟S2:檢測當前運行的應用程序是否出現異常;
[0127]步驟S4:在檢測到應用程序出現異常的情況下,獲取應用程序在運行的過程中已開始執行的任務的信息,其中,已開始執行的任務的信息用于對異常進行定位;
[0128]步驟S6:將已開始執行的任務的信息發送至應用程序的服務器。
[0129]采用本發明的上述實施例,若當前運行的應用程序發生異常,則獲取已開始執行的任務的信息,并將獲取的已開始執行的任務的信息發送至應用程序的服務器,從而可以在程序發生crash時,獲取已開始執行的所有程序任務的函數調用信息,以獲取完整的各個線程的堆棧信息,服務器在獲取完整的堆棧信息之后,可以還原程序發生crash的場景,從而可以準確定位程序發生crash的原因,解決了現有技術中在程序發生crash時,無法準確定位crash原因的問題。
[0130]可選地,本實施例中的具體示例可以參考上述實施例中所描述的示例,本實施例在此不再贅述。
[0131]需要進一步說明的是,寄存區域為系統的內存和系統處理器中的寄存器。
[0132]本領域普通技術人員可以理解,圖10所示的結構僅為示意,終端可以是智能手機(如Android手機、1S手機等)、平板電腦、掌上電腦以及移動互聯網設備(Mobile InternetDevices,MID)、PAD等終端設備。圖10其并不對上述電子裝置的結構造成限定。例如,終端還可包括比圖10中所示更多或者更少的組件(如網絡接口、顯示裝置等),或者具有與圖10所示不同的配置。
[0133]本領域普通技術人員可以理解上述實施例的各種方法中的全部或部分步驟是可以通過程序來指令終端設備相關的硬件來完成,該程序可以存儲于一計算機可讀存儲介質中,存儲介質可以包括:閃存盤、只讀存儲器(Read-Only Memory,ROM)、隨機存取器(RandomAccess Memory,RAM)、磁盤或光盤等。
[0134]實施例4
[0135]本發明的實施例還提供了一種存儲介質。可選地,在本實施例中,上述存儲介質可以用于執行應用程序的信息處理方法的程序代碼。
[0136]可選地,在本實施例中,上述存儲介質可以位于如圖2所示的網絡中的多個網絡設備中的至少一個網絡設備。
[0137]可選地,在本實施例中,存儲介質被設置為存儲用于執行以下步驟的程序代碼:
[0138]步驟S1:檢測當前運行的應用程序是否出現異常;
[0139]步驟S3:在檢測到應用程序出現異常的情況下,獲取應用程序在運行的過程中已開始執行的任務的信息,其中,已開始執行的任務的信息用于對異常進行定位;
[0140]步驟S5:將已開始執行的任務的信息發送至應用程序的服務器。
[0141]采用本發明的上述實施例,若當前運行的應用程序發生異常,則獲取已開始執行的任務的信息,并將獲取的已開始執行的任務的信息發送至應用程序的服務器,從而可以在程序發生crash時,獲取已開始執行的所有程序任務的函數調用信息,以獲取完整的各個線程的堆棧信息,服務器在獲取完整的堆棧信息之后,可以還原程序發生crash的場景,從而可以準確定位程序發生crash的原因,解決了現有技術中在程序發生crash時,無法準確定位crash原因的問題。
[0142]可選地,在本實施例中,上述存儲介質可以包括但不限于:U盤、只讀存儲器(R0M,Read-Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代碼的介質。
[0143]可選地,本實施例中的具體示例可以參考上述實施例中所描述的示例,本實施例在此不再贅述。
[0144]上述本發明實施例序號僅僅為了描述,不代表實施例的優劣。
[0145]上述實施例中的集成的單元如果以軟件功能單元的形式實現并作為獨立的產品銷售或使用時,可以存儲在上述計算機可讀取的存儲介質中。基于這樣的理解,本發明的技術方案本質上或者說對現有技術做出貢獻的部分或者該技術方案的全部或部分可以以軟件產品的形式體現出來,該計算機軟件產品存儲在存儲介質中,包括若干指令用以使得一臺或多臺計算機設備(可為個人計算機、服務器或者網絡設備等)執行本發明各個實施例所述方法的全部或部分步驟。
[0146]在本發明的上述實施例中,對各個實施例的描述都各有側重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關描述。
[0147]在本申請所提供的幾個實施例中,應該理解到,所揭露的客戶端,可通過其它的方式實現。其中,以上所描述的裝置實施例僅僅是示意性的,例如所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現時可以有另外的劃分方式,例如多個單元或組件可以結合或者可以集成到另一個系統,或一些特征可以忽略,或不執行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。
[0148]所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網絡單元上。可以根據實際的需要選擇其中的部分或者全部單元來實現本實施例方案的目的。
[0149]另外,在本發明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現,也可以采用軟件功能單元的形式實現。
[0150]以上所述僅是本發明的優選實施方式,應當指出,對于本技術領域的普通技術人員來說,在不脫離本發明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應視為本發明的保護范圍。
【主權項】
1.一種應用程序的信息處理方法,其特征在于,包括: 檢測當前運行的應用程序是否出現異常; 在檢測到所述應用程序出現異常的情況下,獲取所述應用程序在運行的過程中已開始執行的任務的信息,其中,所述已開始執行的任務的信息用于對所述異常進行定位; 將所述已開始執行的任務的信息發送至所述應用程序的服務器。2.根據權利要求1所述的方法,其特征在于,獲取所述應用程序在運行的過程中已開始執行的任務的信息包括: 獲取用于執行所述已開始執行的任務的所有線程的函數調用信息,其中,所述已開始執行的任務的信息包括所述函數調用信息。3.根據權利要求2所述的方法,其特征在于,獲取用于執行所述已開始執行的任務的所有線程的函數調用信息包括: 獲取第一線程的第一函數調用堆棧信息,其中,所述第一線程為發生所述異常的任務所在的線程; 從所述第一線程的線程本地存儲單元中,獲取預先保存的第二線程的第二函數調用堆棧信息, 其中,所述第二線程為向所述第一線程發起異步任務的線程,所述函數調用信息包括所述第一函數調用堆棧信息和所述第二函數調用堆棧信息,所述所有線程包括所述第一線程和所述第二線程。4.根據權利要求1所述的方法,其特征在于,所述已開始執行的任務包括:在發生所述異常前開始執行并且執行完成的任務和在發生所述異常前開始執行但尚未執行完成的任務。5.根據權利要求1所述的方法,其特征在于,在所述應用程序運行的過程中,所述方法還包括: 在第二線程向第一線程發起異步任務之前,獲取所述第二線程的第二函數調用堆棧信息; 在所述第一線程執行所述異步任務之前,將所述第二函數調用堆棧信息保存在所述第一線程的線程本地存儲單元中, 其中,所述已開始執行的任務包括所述異步任務。6.根據權利要求5所述的處理方法,其特征在于,獲取所述第二線程的第二函數調用堆棧信息包括: 獲取所述第二線程的當前函數調用堆棧信息; 從所述第二線程的線程本地存儲單元中,讀取預先保存的前序線程的函數調用堆棧信息; 將所述當前函數調用堆棧信息和所述前序線程的函數調用堆棧信息作為所述第二函數調用堆棧信息, 其中,所述前序線程為在所述第二線程執行所述已開始執行的任務之前執行所述已開始執行的任務的線程。7.根據權利要求5所述的方法,其特征在于,將所述第二函數調用堆棧信息保存在所述第一線程的線程本地存儲單元中包括: 將所述第二函數調用堆棧信息存儲在所述異步任務的對象中; 將所述異步任務的對象發送至所述第一線程的任務隊列; 在執行所述異步任務之前,從所述異步任務的對象中讀取所述第二函數調用堆棧信息,并將所述第二函數調用堆棧信息保存在所述第一線程的線程本地存儲單元中。8.根據權利要求7所述的方法,其特征在于,在將所述第二函數調用堆棧信息保存在所述第一線程的線程本地存儲單元中之后,所述方法還包括: 執行所述異步任務,在執行完成所述異步任務之后,清空所述第一線程的線程本地存儲單元。9.一種應用程序的信息處理裝置,其特征在于,包括: 檢測單元,用于檢測當前運行的應用程序是否出現異常; 第一獲取單元,用于在檢測到所述應用程序出現異常的情況下,獲取所述應用程序在運行的過程中已開始執行的任務的信息,其中,所述已開始執行的任務的信息用于對所述異常進行定位; 發送單元,用于將所述已開始執行的任務的信息發送至所述應用程序的服務器。10.根據權利要求9所述的裝置,其特征在于,所述獲取單元包括: 第一獲取子單元,用于獲取用于執行所述已開始執行的任務的所有線程的函數調用信息,其中,所述已開始執行的任務的信息包括所述函數調用信息。11.根據權利要求10所述的裝置,其特征在于,所述獲取子單元包括: 第一獲取模塊,用于獲取第一線程的第一函數調用堆棧信息,其中,所述第一線程為發生所述異常的任務所在的線程; 第二獲取模塊,用于從所述第一線程的線程本地存儲單元中,獲取預先保存的第二線程的第二函數調用堆棧信息, 其中,所述第二線程為向所述第一線程發起異步任務的線程,所述函數調用信息包括所述第一函數調用堆棧信息和所述第二函數調用堆棧信息,所述所有線程包括所述第一線程和所述第二線程。12.根據權利要求9所述的裝置,其特征在于,所述已開始執行的任務包括:在發生所述異常前開始執行并且執行完成的任務和在發生所述異常前開始執行但尚未執行完成的任務。13.根據權利要求9所述的裝置,其特征在于,所述裝置還包括: 第二獲取單元,用于在所述應用程序運行的過程中,在第二線程向第一線程發起異步任務之前,獲取所述第二線程的第二函數調用堆棧信息; 第一保存單元,用于在所述第一線程執行所述異步任務之前,將所述第二函數調用堆棧信息保存在所述第一線程的線程本地存儲單元中, 其中,所述已開始執行的任務包括所述異步任務。14.根據權利要求13所述的處理裝置,其特征在于,所述第二獲取單元包括: 第二獲取子單元,用于獲取所述第二線程的當前函數調用堆棧信息; 讀取子單元,用于從所述第二線程的線程本地存儲單元中,讀取預先保存的前序線程的函數調用堆棧信息; 確定子單元,用于將所述當前函數調用堆棧信息和所述前序線程的函數調用堆棧信息作為所述第二函數調用堆棧信息, 其中,所述前序線程為在所述第二線程執行所述已開始執行的任務之前執行所述已開始執行的任務的線程。15.根據權利要求13所述的裝置,其特征在于,所述保存單元包括: 存儲子單元,用于將所述第二函數調用堆棧信息存儲在所述異步任務的對象中; 發送子單元,用于將所述異步任務的對象發送至所述第一線程的任務隊列; 讀取保存子單元,用于在執行所述異步任務之前,從所述異步任務的對象中讀取所述第二函數調用堆棧信息,并將所述第二函數調用堆棧信息保存在所述第一線程的線程本地存儲單元中。16.根據權利要求15所述的裝置,其特征在于,所述裝置還包括: 處理單元,用于在將所述第二函數調用堆棧信息保存在所述第一線程的線程本地存儲單元中之后,執行所述異步任務,在執行完成所述異步任務之后,清空所述第一線程的線程本地存儲單元。
【文檔編號】G06F11/36GK105843741SQ201610177236
【公開日】2016年8月10日
【申請日】2016年3月24日
【發明人】彭勇, 李勁秋
【申請人】騰訊科技(深圳)有限公司