两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

應(yīng)用程序的信息處理方法和裝置的制造方法

文檔序號(hào):10488869閱讀:328來(lái)源:國(guó)知局
應(yīng)用程序的信息處理方法和裝置的制造方法
【專利摘要】本發(fā)明公開(kāi)了一種應(yīng)用程序的信息處理方法和裝置。其中,該方法包括:根據(jù)本發(fā)明實(shí)施例的一個(gè)方面,提供了一種應(yīng)用程序的信息處理方法,該信息處理方法包括:檢測(cè)當(dāng)前運(yùn)行的應(yīng)用程序是否出現(xiàn)異常;在檢測(cè)到應(yīng)用程序出現(xiàn)異常的情況下,獲取應(yīng)用程序在運(yùn)行的過(guò)程中已開(kāi)始執(zhí)行的任務(wù)的信息,其中,已開(kāi)始執(zhí)行的任務(wù)的信息用于對(duì)異常進(jìn)行定位;將已開(kāi)始執(zhí)行的任務(wù)的信息發(fā)送至應(yīng)用程序的服務(wù)器。本發(fā)明解決了在程序發(fā)生crash時(shí),無(wú)法準(zhǔn)確定位crash原因的技術(shù)問(wèn)題。
【專利說(shuō)明】
應(yīng)用程序的信息處理方法和裝置
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,具體而言,涉及一種應(yīng)用程序的信息處理方法和裝置。
【背景技術(shù)】
[0002]現(xiàn)有的安卓Andoid開(kāi)發(fā)IDE(即android stud1)在斷點(diǎn)調(diào)試時(shí),可以查看當(dāng)前的函數(shù)調(diào)用棧;產(chǎn)品外發(fā)版本發(fā)生crash(即,程序崩潰)時(shí),現(xiàn)有的程序崩潰上報(bào)平臺(tái)也可以上報(bào)程序發(fā)生崩潰時(shí)的函數(shù)調(diào)用棧,程序開(kāi)發(fā)根據(jù)上報(bào)的調(diào)用棧內(nèi)容可以定位程序發(fā)生崩潰的原因,并基于該定位的原因做修正。
[0003]圖1示出了現(xiàn)有技術(shù)中的多線程環(huán)境的數(shù)據(jù)結(jié)構(gòu),如圖1所示,現(xiàn)有技術(shù)方案中,一個(gè)進(jìn)程中可以包括多個(gè)線程,如圖1示出的線程A和線程B,線程A中包括任務(wù)隊(duì)列,線程B中也包括一個(gè)任務(wù)隊(duì)列,如果在應(yīng)用程序執(zhí)行任務(wù)的過(guò)程中,線程A中拋一個(gè)異步任務(wù)Tl到線程B中執(zhí)行,則該異步任務(wù)Tl會(huì)先添加到線程B的任務(wù)隊(duì)列中,線程B會(huì)按順序從隊(duì)列中去獲取任務(wù),并一一執(zhí)行。采用該方案,如果在線程B中執(zhí)行任務(wù)時(shí)發(fā)生crash,則程序只能獲取到在線程B中的函數(shù)調(diào)用堆棧,并將該線程B中的函數(shù)調(diào)用堆棧上報(bào)至crash上報(bào)平臺(tái)。
[0004]由上可知,不管是現(xiàn)有的IDE或者現(xiàn)有的crash上報(bào)平臺(tái),在程序執(zhí)行任務(wù)過(guò)程中發(fā)生crash時(shí)都只能獲取當(dāng)前線程的調(diào)用棧。如果外發(fā)版本crash在一個(gè)子線程,則獲取該子線程的函數(shù)調(diào)用棧,而無(wú)法追溯之前線程的調(diào)用棧。由于觸發(fā)一個(gè)操作的起因很多,若程序執(zhí)行該操作時(shí)發(fā)生crash,只能獲取當(dāng)前線程的函數(shù)調(diào)用棧,無(wú)法還原用戶的使用場(chǎng)景,無(wú)法獲知觸發(fā)該操作的起因,因此也無(wú)法定位發(fā)生crash的真正原因。
[0005]針對(duì)上述在程序發(fā)生crash時(shí),無(wú)法準(zhǔn)確定位crash原因的問(wèn)題,目前尚未提出有效的解決方案。

【發(fā)明內(nèi)容】

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