日韩成人黄色,透逼一级毛片,狠狠躁天天躁中文字幕,久久久久久亚洲精品不卡,在线看国产美女毛片2019,黄片www.www,一级黄色毛a视频直播

系統(tǒng)重啟原因的檢測方法、裝置及終端設(shè)備的制作方法

文檔序號:6520177閱讀:381來源:國知局
系統(tǒng)重啟原因的檢測方法、裝置及終端設(shè)備的制作方法
【專利摘要】本公開實施例公開了一種系統(tǒng)重啟原因檢測方法、裝置及終端設(shè)備,在智能終端重啟后,所述系統(tǒng)重啟原因檢測方法首先需要獲取系統(tǒng)日志文件,接著,查找系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息,當(dāng)包含強制結(jié)束系統(tǒng)進程的進程消息時,獲取相關(guān)的線程堆棧數(shù)據(jù),并根據(jù)所述線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因;當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為由于線程間互鎖時,確定互鎖的線程;當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。從而在智能終端重啟后能夠快速檢測出是否由于系統(tǒng)死鎖導(dǎo)致重啟,如果由于系統(tǒng)死鎖導(dǎo)致重啟,能夠快速確定死鎖的線程,無需研發(fā)人員逐條分析系統(tǒng)消息,因此,速度快、效率高。
【專利說明】系統(tǒng)重啟原因的檢測方法、裝置及終端設(shè)備
【技術(shù)領(lǐng)域】
[0001]本公開涉及計算機【技術(shù)領(lǐng)域】,特別是涉及系統(tǒng)重啟原因的檢測方法、裝置及終端設(shè)備。
【背景技術(shù)】
[0002]隨著智能終端的廣泛應(yīng)用,智能終端設(shè)備生產(chǎn)商為了推出具有自己特色的產(chǎn)品,通常會針對自己的智能終端設(shè)備深度定制屬于自己的系統(tǒng)(例如,Android系統(tǒng))。由于系統(tǒng)研發(fā)人員對智能終端的系統(tǒng)認識不足,編寫程序不規(guī)范,使得系統(tǒng)資源分配策略不當(dāng),導(dǎo)致進程(或線程)因競爭資源而產(chǎn)生死鎖現(xiàn)象,進而導(dǎo)致系統(tǒng)頻繁重啟。但是,當(dāng)智能終端重啟后,系統(tǒng)研發(fā)人員需要逐條分析系統(tǒng)消息確定是否由于死鎖導(dǎo)致智能終端重啟,此種方式速度慢、效率低。

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

[0003]本公開實施例中提供了系統(tǒng)重啟原因的檢測方法、裝置及終端設(shè)備,以實現(xiàn)在智能終端重啟后,能夠快速、高效地檢測出是否由于系統(tǒng)死鎖導(dǎo)致重啟,如果由于系統(tǒng)死鎖導(dǎo)致系統(tǒng)重啟時,能夠快速確定導(dǎo)致系統(tǒng)死鎖的線程。
[0004]為了解決上述技術(shù)問題,本公開實施例公開了如下技術(shù)方案:
[0005]第一方面,本公開提供一種系統(tǒng)重啟原因的檢測方法,包括:獲取系統(tǒng)日志文件;查找所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息;當(dāng)系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息時,獲取線程堆棧數(shù)據(jù),并根據(jù)所述線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因;當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程間互鎖時,確定互鎖的線程;當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。
[0006]結(jié)合第一方面,在第一方面第一種可能的實現(xiàn)方式中,還包括:查找所述強制結(jié)束系統(tǒng)進程的進程消息中是否包含線程名稱,當(dāng)所述強制結(jié)束系統(tǒng)進程的進程消息中包含線程名稱時,執(zhí)行獲取線程堆棧數(shù)據(jù)的步驟;當(dāng)不包含線程名稱時,確定線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
[0007]結(jié)合第一方面或第一方面第一種可能的實現(xiàn)方式,在第一方面第二種可能的實現(xiàn)方式中,獲取線程堆棧數(shù)據(jù),并根據(jù)所述線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因的步驟,采用如下方式:
[0008]獲取所述進程消息中第一線程對應(yīng)的第一線程堆棧數(shù)據(jù);
[0009]查找所述第一線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息,所述等待互斥鎖消息包含持有第一線程所等待互斥鎖的第二線程;
[0010]當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第一線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖;
[0011]當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)存在等待互斥鎖消息時,獲取持有第一線程所等待互斥鎖的第二線程對應(yīng)的第二線程堆棧數(shù)據(jù);[0012]查找所述第二線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息;
[0013]當(dāng)?shù)诙€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第二線程持鎖時間過長導(dǎo)致系統(tǒng)死鎖;
[0014]當(dāng)?shù)诙€程堆棧數(shù)據(jù)包含等待互斥鎖消息時,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系;
[0015]當(dāng)?shù)诙€程與第一線程構(gòu)成持鎖依賴關(guān)系時,確定由于線程間互鎖導(dǎo)致系統(tǒng)死鎖;
[0016]當(dāng)?shù)诙€程與第一線程未構(gòu)成持鎖依賴關(guān)系時,將持有第二線程所等待互斥鎖的線程作為新的第二線程,返回執(zhí)行獲取新的第二線程對應(yīng)第二線程堆棧數(shù)據(jù)。
[0017]結(jié)合第一方面的第二種可能的實現(xiàn)方式,在第一方面第三種可能的實現(xiàn)方式中,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系的步驟,采用如下方式:
[0018]判斷第一線程持有的互斥鎖是否是第二線程所等待的互斥鎖;當(dāng)?shù)谝痪€程持有的互斥鎖是第二線程所等待的互斥鎖時,確定第一線程和第二線程間構(gòu)成持鎖依賴關(guān)系;當(dāng)?shù)谝痪€程持有的互斥鎖不是第二線程所等待的互斥鎖時,確定第一線程和第二線程間未構(gòu)成持鎖依賴關(guān)系。
[0019]結(jié)合第一方面的第二種可能的實現(xiàn)方式,在第一方面第四種可能的實現(xiàn)方式中,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系的步驟,采用如下方式:
[0020]根據(jù)獲得的線程堆棧數(shù)據(jù)中的等待互斥鎖消息,構(gòu)建持鎖依賴關(guān)系圖數(shù)據(jù);判斷所述持鎖依賴關(guān)系圖數(shù)據(jù)中是否存在環(huán)路,如果所述持鎖依賴關(guān)系圖數(shù)據(jù)存在環(huán)路,確定由于環(huán)路上的各個線程構(gòu)成持鎖依賴關(guān)系。
[0021]結(jié)合第一方面的第三種可能的實現(xiàn)方式或第一方面的第四種可能的實現(xiàn)方式,在第一方面的第五種可能的實現(xiàn)方式中,確定構(gòu)成持鎖依賴關(guān)系的線程為互鎖的線程。
[0022]第二方面,本公開還提供了一種系統(tǒng)重啟原因的檢測裝置,包括:
[0023]第一獲取單元,用于獲取系統(tǒng)日志文件;
[0024]第一查找單元,用于所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息;
[0025]第二獲取單元,用于當(dāng)所述系統(tǒng)日志文件包含強制結(jié)束系統(tǒng)進程的進程消息時,獲取線程堆棧數(shù)據(jù),并根據(jù)獲得的線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因;
[0026]第一確定單元,用于當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程間互鎖時,確定互鎖的線程;
[0027]第二確定單元,用于當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。
[0028]結(jié)合第二方面,在第二方面第一種可能的實現(xiàn)方式中,還包括:
[0029]第二查找單元,用于查找所述強制結(jié)束系統(tǒng)進程的進程消息中是否包含線程名稱,當(dāng)所述強制結(jié)束系統(tǒng)進程的進程消息中包含線程名稱時,觸發(fā)第二獲取單元獲取線程堆棧數(shù)據(jù);當(dāng)不包含線程名稱時,確定線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
[0030]結(jié)合第二方面或第二方面第一種可能的實現(xiàn)方式,在第二方面第二種可能的實現(xiàn)方式中,所述第二獲取單元包括:
[0031]第一獲取子單元,用于獲取所述進程消息中第一線程對應(yīng)的第一線程堆棧數(shù)據(jù);
[0032]第一查找子單元,用于查找所述第一線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息,所述等待互斥鎖消息包含持有第一線程所等待互斥鎖的第二線程;
[0033]第一確定子單元,用于當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第一線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖;
[0034]第二獲取子單元,用于當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)存在等待互斥鎖消息時,獲取持有第一線程所等待互斥鎖的第二線程對應(yīng)的第二線程堆棧數(shù)據(jù);
[0035]第二查找子單元,用于查找所述第二線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息;
[0036]第二確定子單元,用于當(dāng)?shù)诙€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第二線程持鎖時間過長導(dǎo)致系統(tǒng)死鎖;
[0037]第一判斷子單元,用于當(dāng)?shù)诙€程堆棧數(shù)據(jù)包含等待互斥鎖消息時,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系;
[0038]第三確定子單元,用于當(dāng)?shù)诙€程與第一線程構(gòu)成持鎖依賴關(guān)系時,確定由于線程間互鎖導(dǎo)致系統(tǒng)死鎖;
[0039]線程更新單元,用于當(dāng)?shù)诙€程與第一線程未構(gòu)成持鎖依賴關(guān)系時,將持有第二線程所等待互斥鎖的線程作為新的第二線程,并觸發(fā)第二獲取子單元獲取新的第二線程對應(yīng)的第二線程堆棧數(shù)據(jù)。
[0040]結(jié)合第二方面第二種可能的實現(xiàn)方式,在第二方面第三種可能的實現(xiàn)方式中,所述第一判斷子單元包括:
[0041]第二判斷子單元,用于判斷第一線程持有的互斥鎖是否是第二線程所等待的互斥鎖;
[0042]第四確定子單元,用于當(dāng)?shù)谝痪€程持有的互斥鎖是第二線程所等待的互斥鎖時,確定第一線程和第二線程間構(gòu)成持鎖依賴關(guān)系;或者,當(dāng)?shù)谝痪€程持有的互斥鎖不是第二線程所等待的互斥鎖時,確定第一線程和第二線程間未構(gòu)成持鎖依賴關(guān)系。
[0043]結(jié)合第二方面第二種可能的實現(xiàn)方式,在第二方面第四種可能的實現(xiàn)方式中,所述第一判斷子單元包括:
[0044]構(gòu)建單元,用于根據(jù)獲得的線程堆棧數(shù)據(jù)中的等待互斥鎖消息,構(gòu)建持鎖依賴關(guān)系圖數(shù)據(jù);
[0045]第三判斷子單元,用于判斷所述持鎖依賴關(guān)系圖數(shù)據(jù)中是否存在環(huán)路;
[0046]第五確定子單元,用于當(dāng)所述持鎖依賴關(guān)系圖數(shù)據(jù)存在環(huán)路時,確定環(huán)路上的各個線程構(gòu)成持鎖依賴關(guān)系。
[0047]結(jié)合第二方面第三種可能的實現(xiàn)方式或第二方面第四種可能的實現(xiàn)方式,在第二方面第五種可能的實現(xiàn)方式中,第一確定單元配置為確定構(gòu)成持鎖依賴關(guān)系的線程為互鎖的線程。
[0048]第三方面,本公開提供了一種終端設(shè)備,包括存儲器,以及一個或者一個以上的指令,其中一個或者一個以上指令存儲于存儲器中,且經(jīng)配置以由一個或者一個以上處理器執(zhí)行所述一個或者一個以上指令所包含用于進行以下操作的指令:
[0049]獲取系統(tǒng)日志文件;
[0050]查找所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息;
[0051]當(dāng)系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息時,獲取線程堆棧數(shù)據(jù),并根據(jù)所述線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因;[0052]當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為由于線程間互鎖時,確定互鎖的線程;
[0053]當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。
[0054]本公開的有益效果可以包括:在智能終端重啟后,首先獲取系統(tǒng)日志文件,判斷所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息,如果包含則確定由于死鎖導(dǎo)致智能終端重啟,進一步判斷由于線程間互鎖導(dǎo)致死鎖,還是由于線程持鎖時間過長導(dǎo)致死鎖,如果由于線程間互鎖導(dǎo)致死鎖,確定互鎖的線程;如果線程持鎖時間過長導(dǎo)致死鎖,確定該線程。從而,在智能終端重啟后,無需研發(fā)人員逐條分析系統(tǒng)消息,能夠快速、高效地確定出現(xiàn)死鎖的線程。
【專利附圖】

【附圖說明】
[0055]為了更清楚地說明本公開實施例中的技術(shù)方案,下面將對實施例中所需要使用的附圖作簡單地介紹,顯而易見地,對于本領(lǐng)域普通技術(shù)人員而言,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0056]圖1為一種線程間互鎖關(guān)系的示意圖;
[0057]圖2為本公開實施例一種系統(tǒng)重啟原因的檢測方法的流程示意圖;
[0058]圖3為圖2所示實施例的步驟S230的流程示意圖;
[0059]圖4為本公開實施例另一種系統(tǒng)重啟原因的檢測方法的流程示意圖;
[0060]圖5為本公開一種系統(tǒng)重啟原因的檢測方法實例的流程示意圖;
[0061]圖6為本公開實施例一種系統(tǒng)重啟原因檢測裝置的結(jié)構(gòu)示意圖;
[0062]圖7為本公開實施例另一種系統(tǒng)重啟原因檢測裝置的結(jié)構(gòu)示意圖;
[0063]圖8為本公開實施例的第二獲取單元的結(jié)構(gòu)示意圖;
[0064]圖9為本公開實施例一種終端設(shè)備的結(jié)構(gòu)示意圖。
【具體實施方式】
[0065]本公開提供了一種系統(tǒng)重啟原因檢測方法、裝置及終端設(shè)備,在智能終端重啟后,所述系統(tǒng)重啟原因檢測方法首先需要獲取系統(tǒng)日志文件,接著,查找系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息,當(dāng)包含強制結(jié)束系統(tǒng)進程的進程消息時,獲取相關(guān)的線程堆棧數(shù)據(jù),并根據(jù)所述線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因;當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為由于線程間互鎖時,確定互鎖的線程;當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。從而在智能終端重啟后能夠快速檢測出是否由于系統(tǒng)死鎖導(dǎo)致重啟,如果由于系統(tǒng)死鎖導(dǎo)致重啟,能夠快速確定死鎖的線程,無需研發(fā)人員逐條分析系統(tǒng)消息,因此,速度快、效率高。
[0066]以上是本公開的核心思想,為了使本領(lǐng)域技術(shù)人員更好地理解本公開方案,下面將結(jié)合本公開實施例中的附圖,對本公開實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所述描述的實施例僅是本公開一部分實施例,而不是全部的實施例?;诒竟_中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本公開保護的范圍。
[0067]在詳細介紹本公開的實施例之前,首先介紹下系統(tǒng)死鎖的相關(guān)內(nèi)容。[0068]系統(tǒng)死鎖(deadlock)是指兩個或兩個以上的進程在執(zhí)行過程中,因爭奪資源造成互相等待的現(xiàn)象,如果沒有外力作用,它們都將無法繼續(xù)執(zhí)行,此時稱系統(tǒng)處于死鎖狀態(tài)。
[0069]由于智能終端中的資源有限,因此資源占用具有互斥性,即當(dāng)某個進程(線程)占用資源后,使得其他進程(線程)在無外力的協(xié)助下,不能獲取到該資源而無法繼續(xù)運行。在多進程(線程)應(yīng)用中,通常利用互斥鎖對系統(tǒng)中的共享資源進行保護。當(dāng)一個進程(線程)請求占用共享資源時,首先獲取該資源的互斥鎖,獲得對應(yīng)的互斥鎖之后才能占用該共享資源,最后釋放所述互斥鎖,以使其他進程(線程)獲得進而占用所述共享資源。如果資源分配策略不當(dāng),將可能出現(xiàn)互斥鎖被某個進程(線程)無限期的占用,導(dǎo)致其他進程(線程)無法使用共享資源,最終引起進程(線程)死鎖。
[0070]請參見圖1,示出了一種線程間互鎖關(guān)系的示意圖,在同一進程中有多個并行運行的線程。
[0071]假設(shè)在Android系統(tǒng)中,線程1、線程2和線程3并行運行在system_server進程中,其中,線程I持有互斥鎖A等待互斥鎖B,線程2持有互斥鎖B等待互斥鎖C,同時,線程3持有互斥鎖C等待互斥鎖A。而且,每個線程都要獲得等待的互斥鎖后,才釋放其他線程所等待的互斥鎖,即線程I在獲得互斥鎖B后才釋放互斥鎖A、而線程2在獲得互斥鎖C后才釋放互斥鎖B,線程3在獲得互斥鎖A后才釋放互斥鎖C,此時線程1、線程2、線程3都得不到等待的互斥鎖,并且會一直等待下去,從而造成線程死鎖。此時,Android系統(tǒng)中的WatchDog程序就會強制結(jié)束(殺死)system_server進程,最終導(dǎo)致Android系統(tǒng)重啟。
[0072]請參見圖2,示出了本公開實施例一種系統(tǒng)重啟原因的檢測方法的流程示意圖,該方法應(yīng)用于終端設(shè)備,如圖2所示,所述方法可以包括以下步驟:
[0073]首先,在步驟S210,獲取系統(tǒng)日志文件。所述系統(tǒng)日志文件是記錄系統(tǒng)操作事件的記錄文件或文件集合。
[0074]接著,在步驟S220,查找所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息,若系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息,執(zhí)行步驟S230 ;若系統(tǒng)日志文件中不包含強制結(jié)束系統(tǒng)進程的進程消息,則確定不是由于系統(tǒng)死鎖導(dǎo)致系統(tǒng)重啟,進而結(jié)束。
[0075]當(dāng)操作系統(tǒng)是Android系統(tǒng)時,通過查找Android系統(tǒng)內(nèi)的系統(tǒng)日志文件中是否包含“Watchdog killing system process:threadl ” 的進程消息,其中,“threadl ”表不線程名稱。如果系統(tǒng)日志文件中包含所述進程消息,表明Android系統(tǒng)發(fā)生了死鎖。如果不包含類似的信息,表明Android系統(tǒng)未發(fā)生死鎖。本領(lǐng)域技術(shù)可以理解的是,在其他的操作系統(tǒng)中,可以是其他形式的強制結(jié)束系統(tǒng)進程的進程消息。
[0076]然后,在步驟S230,獲取線程堆棧數(shù)據(jù),并根據(jù)所述線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因。
[0077]該步驟獲取與強制結(jié)束系統(tǒng)進程的進程消息的相關(guān)線程的線程堆棧數(shù)據(jù),所述相關(guān)線程包括所述強制結(jié)束系統(tǒng)進程的進程消息所攜帶的線程名稱對應(yīng)的線程及與所述線程名稱對應(yīng)的線程堆棧數(shù)據(jù)直接或間接相關(guān)聯(lián)的線程。進一步跟進獲得的線程堆棧數(shù)據(jù)確定導(dǎo)致系統(tǒng)死鎖的原因。
[0078]在步驟S240,當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程間互鎖時,確定互鎖的線程。
[0079]在步驟S250,當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。
[0080]本實施例提供的系統(tǒng)重啟原因的檢測方法,在系統(tǒng)重啟后,首先獲取系統(tǒng)日志文件,通過判斷系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息,確定是否是系統(tǒng)死鎖導(dǎo)致系統(tǒng)重啟;如果系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息,則表明由于系統(tǒng)死鎖導(dǎo)致系統(tǒng)重啟,然后,獲取相關(guān)線程的線程堆棧數(shù)據(jù),從而確定導(dǎo)致系統(tǒng)死鎖的原因,進而確定導(dǎo)致系統(tǒng)死鎖的線程。由上述的檢測過程可知,系統(tǒng)能夠自動檢測出是否由于系統(tǒng)死鎖導(dǎo)致系統(tǒng)重啟,進而當(dāng)系統(tǒng)死鎖導(dǎo)致系統(tǒng)重啟時,能夠確定出導(dǎo)致系統(tǒng)死鎖的線程,無需研發(fā)人員逐條分析系統(tǒng)消息,因此,檢測速度快、效率高。
[0081]在本公開的一個實施例中,如圖3所示,上述實施例中的步驟S230可以包括以下步驟:
[0082]首先,在步驟S310,獲取強制結(jié)束系統(tǒng)進程的進程消息中第一線程對應(yīng)的第一線程堆棧數(shù)據(jù)。所述第一線程為強制結(jié)束系統(tǒng)進程的進程消息中所包含線程名稱,該步驟從應(yīng)用程序錯誤信息反饋文件(例如,Android系統(tǒng)中的traces, txt文件)中獲取所述第一線程對應(yīng)的第一線程堆棧數(shù)據(jù)。
[0083]接下來,在步驟S320,查找所述第一線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息;所述等待互斥鎖消息包含持有第一線程所等待互斥鎖的第二線程。
[0084]例如,在Android系統(tǒng)中,查找第一線程堆棧數(shù)據(jù)中是否包含“waiting**held bytid=*”的類似消息,其中,“**”代表第一線程所等待的互斥鎖的名稱,代表持有互斥鎖“**”的線程號,如果存在類似消息,則表明第一線程堆棧數(shù)據(jù)中包含等待互斥鎖消息;如果不存在類似消息,則表明第一線程堆棧數(shù)據(jù)中不包含等待互斥鎖消息。
[0085]當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,執(zhí)行步驟S330,確定第一線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖;即,第一線程執(zhí)行某個函數(shù)時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
[0086]當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)存在等待互斥鎖消息時,執(zhí)行步驟S340,獲取第二線程對應(yīng)的第二線程堆棧數(shù)據(jù)。
[0087]假設(shè),第一線程堆棧數(shù)據(jù)中包含的等待互斥鎖消息為“waiting A held bytid=2”,此等待互斥鎖消息表征第一線程等待的線程鎖A被線程號為2的線程“thread2”所持有,則線程“thread2”為該步驟中的第二線程。獲取第二線程對應(yīng)的第二線程堆棧數(shù)據(jù)。
[0088]然后,在步驟S350,查找所述第二線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息。該步驟的查找過程與步驟S320的查找過程相同,此處不再贅述。
[0089]當(dāng)?shù)诙€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,在步驟S360,確定第二線程持鎖時間過長導(dǎo)致系統(tǒng)死鎖;即由于第二線程執(zhí)行某個函數(shù)時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
[0090]當(dāng)?shù)诙€程堆棧數(shù)據(jù)包含等待互斥鎖消息時,在步驟S370,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系。
[0091]在本公開的一個實施例中,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系的過程可以包括以下子步驟:
[0092]首先,判斷第一線程持有的互斥鎖是否是最新的第二線程所等待的互斥鎖。
[0093]當(dāng)?shù)谝痪€程持有的互斥鎖是最新的第二線程所等待的互斥鎖時,確定第一線程和全部的第二線程間構(gòu)成持鎖依賴關(guān)系。
[0094]當(dāng)?shù)谝痪€程持有的互斥鎖不是最新的第二線程所等待的互斥鎖時,確定第一線程和全部的第二線程間未構(gòu)成持鎖依賴關(guān)系。
[0095]在本公開的另一個實施例中,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系的過程可以包括以下子步驟:
[0096]首先,根據(jù)獲得的線程堆棧數(shù)據(jù)中的等待互斥鎖消息,構(gòu)建持鎖依賴關(guān)系圖數(shù)據(jù)。
[0097]在構(gòu)建持鎖依賴關(guān)系圖數(shù)據(jù)時,以線程為節(jié)點,用有向線段連接存在互斥鎖等待關(guān)系的線程,且有向線段的方向指向請求互斥鎖的線程,從而生成持鎖依賴關(guān)系圖數(shù)據(jù)。
[0098]然后,判斷所述持鎖依賴關(guān)系圖數(shù)據(jù)中是否存在環(huán)路,如果所述持鎖依賴關(guān)系圖數(shù)據(jù)存在環(huán)路,確定由于環(huán)路上的各個線程構(gòu)成持鎖依賴關(guān)系。
[0099]依次以持鎖依賴關(guān)系圖數(shù)據(jù)中的各個節(jié)點為起點沿有向線段的方向進行追蹤,以查詢是否存在環(huán)路,若存在環(huán)路,則確定處于環(huán)路上的各個線程間存在持鎖依賴關(guān)系。
[0100]若步驟S370判斷出第二線程與第一線程構(gòu)成持鎖依賴關(guān)系,在步驟S380,確定由于線程間互鎖導(dǎo)致系統(tǒng)死鎖。
[0101]若步驟S370判斷出第二線程與第一線程未構(gòu)成持鎖依賴關(guān)系,在步驟S390,將持有第二線程所等待互斥鎖的線程作為新的第二線程,返回執(zhí)行步驟S340獲取新的第二線程對應(yīng)第二線程堆棧數(shù)據(jù),直到判斷出構(gòu)成持鎖依賴關(guān)系的線程,或者,確定出某個線程持鎖時間超過預(yù)設(shè)時間。
[0102]請參見圖4,示出了本公開實施例另一種系統(tǒng)重啟原因的檢測方法的流程示意圖,在圖2對應(yīng)的實施例的基礎(chǔ)上,增加查找強制結(jié)束系統(tǒng)進程的進程消息中是否包含線程名稱的過程,如圖4所示,所述方法可以包括以下步驟:
[0103]首先,在步驟S210,獲取系統(tǒng)日志文件。
[0104]接著,在步驟S220,查找所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息,若系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息,執(zhí)行步驟S260 ;若系統(tǒng)日志文件中不包含強制結(jié)束系統(tǒng)進程的進程消息,則確定不是由于系統(tǒng)死鎖導(dǎo)致系統(tǒng)重啟,進而結(jié)束。
[0105]然后,在步驟S260,查找所述強制結(jié)束系統(tǒng)進程的進程消息中是否包含線程名稱;當(dāng)包含線程名稱時,執(zhí)行步驟S230 ;當(dāng)不包含線程名稱(即線程名稱為Null)時,表明由于系統(tǒng)線程(Android系統(tǒng)中,所述系統(tǒng)線程為ServerThread)持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖;即系統(tǒng)線程執(zhí)行某個函數(shù)時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
[0106]在步驟S230,獲取相應(yīng)的線程堆棧數(shù)據(jù),并根據(jù)所述線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因。
[0107]在步驟S240,當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程間互鎖時,確定互鎖的線程。
[0108]在步驟S250,當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。
[0109]本實施例提供的系統(tǒng)重啟原因的檢測方法,在查找到系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息后,進一步查找所述進程消息中是否包含線程名稱,若不包含線程名稱,則確定系統(tǒng)線程執(zhí)行某個函數(shù)時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖;若包好線程名稱,再進一步獲取所述線程名稱對應(yīng)線程的線程堆棧數(shù)據(jù),進而確定導(dǎo)致系統(tǒng)死鎖的線程,即只有強制結(jié)束系統(tǒng)進程的進程消息滿足一定條件時才獲取線程堆棧數(shù)據(jù),節(jié)省了系統(tǒng)資源。
[0110]下面以一個具體實例說明系統(tǒng)重啟原因的檢測方法,如圖5所示,所述方法以可以包括以下步驟:
[0111]當(dāng)系統(tǒng)重啟后,在步驟S510,獲取系統(tǒng)日志文件。
[0112]接著,在步驟S520,查找所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息;
[0113]當(dāng)系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息時,執(zhí)行步驟S530 ;當(dāng)系統(tǒng)日志文件中不包含強制結(jié)束系統(tǒng)進程的進程消息時,則確定不是系統(tǒng)死鎖導(dǎo)致系統(tǒng)重啟,進而結(jié)束。
[0114]在步驟S530,查找強制結(jié)束系統(tǒng)進程的進程消息中是否包含線程名稱;假設(shè)所述進程消息為“Watchdog killing system process:threadl”,所包含的線程名稱為“Threadl”,則執(zhí)行步驟S540 ;
[0115]在步驟S540,獲取線程“Threadl”對應(yīng)的線程堆棧數(shù)據(jù)。
[0116]若所述進程消息中不包含線程名稱(即線程名稱為Null)時,在步驟S550中,確定系統(tǒng)線程執(zhí)行某個函數(shù)的時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖,即系統(tǒng)線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致死鎖。例如,在Android系統(tǒng)中,ServerThread線程執(zhí)行某個函數(shù)的時間超過預(yù)設(shè)時間導(dǎo)致Android系統(tǒng)死鎖。
[0117]獲得線程“Threadl”的線程堆棧數(shù)據(jù)后,在步驟S560,查找“Threadl”的線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息。
[0118]若“Threadl”的線程堆棧數(shù)據(jù)中不包含等待互斥鎖消息,在步驟S570,確定線程“Threadl”執(zhí)行某個函數(shù)時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
[0119]假設(shè)等待互斥鎖消息:“waiting A held by tid=2”,該消息表明線程“Threadl”等待的互斥鎖A被線程號為2的線程所持有,則在步驟S580,獲取“Thread2”的線程堆棧數(shù)據(jù)。
[0120]獲得“ Thread2 ”的線程堆棧數(shù)據(jù)之后,在步驟S590,查找“ Thread2 ”的線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息。
[0121]若“Thread2”的線程堆棧數(shù)據(jù)中不包含等待互斥鎖消息,則在步驟S5100,確定線程“Thread2 ”執(zhí)行某個函數(shù)時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
[0122]若“Thread2”的線程堆棧數(shù)據(jù)中包含等待互斥鎖消息,則在步驟S5110,判斷線程“Thread2”與線程“Threadl ”是否構(gòu)成持鎖依賴關(guān)系;
[0123]假設(shè)所述等待互斥鎖消息:“waiting B held by tid=3”,表明線程“Thread2”所等待的互斥鎖B被線程號為3的線程“Thread3”所持有,線程“Thread2”所等待的互斥鎖B并非被線程“Threadl ”所持有,因此,線程“Thread2”與線程“Threadl ”未構(gòu)成持鎖依賴關(guān)系。
[0124]判斷出線程“Thread2”與線程“Threadl”未構(gòu)成持鎖依賴關(guān)系后,在步驟S5130,將“Thread2”更新為“Thread3”;其中,線程“Thread3”持有線程“Thread2”等待的互斥鎖。
[0125]然后,返回執(zhí)行步驟S580,獲取線程“Thread3”的線程堆棧數(shù)據(jù)。進而,在步驟S590,查找線程“Thread3”的線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息。
[0126]若“Thread3”的線程堆棧數(shù)據(jù)中不包含等待互斥鎖消息,則在步驟S5100,確定線程“Thread3 ”執(zhí)行某個函數(shù)時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
[0127]若“Thread3”的線程堆棧數(shù)據(jù)中包含等待互斥鎖消息:“waiting C heldbytid=l”,表明線程“Thread3”所等待的互斥鎖C被線程號為I的線程“Threadl”所持有,因此,在步驟S5110,判斷出線程“Thread3”與線程“Threadl ”構(gòu)成持鎖依賴關(guān)系。
[0128]在步驟S5120,確定線程間互鎖導(dǎo)致系統(tǒng)死鎖,并確定互鎖的線程。線程“Threadl ”、“Thread2” 和 “Thread3” 為互鎖的線程。線程 “Threadl ”、“Thread2” 和“Thread3”的持鎖依賴關(guān)系與圖1所示的關(guān)系示意圖相同。
[0129]與本公開的系統(tǒng)重啟原因的檢測方法實施例相對應(yīng),本公開還提供了系統(tǒng)重啟原因的檢測裝置實施例。
[0130]請參見圖6,示出了本公開實施例一種系統(tǒng)重啟原因的檢測裝置的結(jié)構(gòu)示意圖,所述裝置可以包括:第一獲取單元100、第一查找單元200、第二獲取單元300、第一確定單元400和第二確定單元500,其中:
[0131]第一獲取單兀100,用于獲取系統(tǒng)日志文件。
[0132]第一查找單元200,用于所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息。在Android系統(tǒng)中,強制結(jié)束系統(tǒng)進程的進程消息為“Watchdog killing systemprocess:threadl” 的類似消息。
[0133]第二獲取單元300,用于當(dāng)所述系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息時,獲取相應(yīng)的線程堆棧數(shù)據(jù),并根據(jù)獲得的線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因。
[0134]第一確定單元400,用于當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程間互鎖時,確定互鎖的線程。
[0135]第二確定單元500,用于當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。
[0136]本實施例提供的系統(tǒng)重啟原因的檢測裝置,在系統(tǒng)重啟后,能夠根據(jù)系統(tǒng)日志文件判斷是否由于系統(tǒng)死鎖導(dǎo)致系統(tǒng)重啟,如果系統(tǒng)重啟原因是系統(tǒng)死鎖,則進一步能夠確定導(dǎo)致系統(tǒng)死鎖的線程,無需研發(fā)人員逐條分析系統(tǒng)消息,因此,檢測速度快、效率高。
[0137]請參見圖7,示出了本公開實施例另一種系統(tǒng)重啟原因的檢測裝置的結(jié)構(gòu)示意圖,該裝置在圖6所示的裝置的基礎(chǔ)上,增加了第二查找單元600。本實施例提供的裝置包括:第一獲取單元100、第一查找單元200、第二獲取單元300、第一確定單元400、第二確定單元500和第二查找單元600。
[0138]其中,本實施例中名稱、編號與圖6所示的實施例相同的單元,其功能也相同,此處不再贅述,下面著重介紹第二查找單元600。
[0139]第二查找單元600連接在第一查找單元200和第二獲取單元300之間。第二查找單元用于查找所述強制結(jié)束系統(tǒng)進程的進程消息中是否包含線程名稱,當(dāng)所述強制結(jié)束系統(tǒng)進程的進程消息中包含線程名稱時,觸發(fā)第二獲取單元300獲取線程堆棧數(shù)據(jù);當(dāng)不包含線程名稱時,確定線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
[0140]本實施例提供的系統(tǒng)重啟原因的檢測裝置,在查找到系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息后,進一步查找所述進程消息中是否包含線程名稱,若不包含線程名稱,則確定系統(tǒng)線程執(zhí)行某個函數(shù)時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖;若包好線程名稱,再進一步獲取所述線程名稱對應(yīng)線程的線程堆棧數(shù)據(jù),進而確定導(dǎo)致系統(tǒng)死鎖的線程,即只有強制結(jié)束系統(tǒng)進程的進程消息滿足一定條件時才獲取線程堆棧數(shù)據(jù),節(jié)省了系統(tǒng)資源。
[0141]請參見圖8所示,示出了本公開實施例提供的第二獲取單元的結(jié)構(gòu)示意圖,所述第二獲取單元可以包括:第一獲取子單元310、第一查找子單元320、第一確定子單元330、第二獲取子單元340、第二查找子單元350、第二確定子單元360、第一判斷子單元370、第三確定子單元380和線程更新單元390。
[0142]第一獲取子單元310,用于獲取所述進程消息中第一線程對應(yīng)的第一線程堆棧數(shù)據(jù)。所述第一線程為強制結(jié)束系統(tǒng)進程的進程消息所包含的線程名稱對應(yīng)的線程。
[0143]第一查找子單元320,用于查找所述第一線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息;所述等待互斥鎖消息包含持有第一線程所等待互斥鎖的第二線程。
[0144]第一確定子單元330,用于當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第一線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
[0145]第二獲取子單元340,用于當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)存在等待互斥鎖消息時,獲取持有第一線程所等待互斥鎖的第二線程對應(yīng)的第二線程堆棧數(shù)據(jù)。
[0146]第二查找子單元350,用于查找所述第二線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消
肩、O
[0147]第二確定子單元360,用于當(dāng)?shù)诙€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第二線程持鎖時間過長導(dǎo)致系統(tǒng)死鎖。
[0148]第一判斷子單元370,用于當(dāng)?shù)诙€程堆棧數(shù)據(jù)包含等待互斥鎖消息時,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系。
[0149]在本公開的一個可能的實施例中,所述第一判斷子單元可以包括:第二判斷子單元和第四確定子單元,其中:
[0150]第二判斷子單元,用于判斷第一線程持有的互斥鎖是否是第二線程所等待的互斥鎖。
[0151]第四確定子單元,用于當(dāng)?shù)谝痪€程持有的互斥鎖是第二線程所等待的互斥鎖時,確定第一線程和第二線程間構(gòu)成持鎖依賴關(guān)系;或者,當(dāng)?shù)谝痪€程持有的互斥鎖不是第二線程所等待的互斥鎖時,確定第一線程和第二線程間未構(gòu)成持鎖依賴關(guān)系。
[0152]在本公開的另一個可能的實施例中,所述第一判斷子單元可以包括:構(gòu)建單元、第三判斷子單元和第五確定子單元,其中:
[0153]構(gòu)建單元,用于根據(jù)獲得的線程堆棧數(shù)據(jù)中的等待互斥鎖消息,構(gòu)建持鎖依賴關(guān)系圖數(shù)據(jù)。
[0154]第三判斷子單元,用于判斷所述持鎖依賴關(guān)系圖數(shù)據(jù)中是否存在環(huán)路。
[0155]第五確定子單元,用于當(dāng)所述持鎖依賴關(guān)系圖數(shù)據(jù)存在環(huán)路時,確定環(huán)路上的各個線程構(gòu)成持鎖依賴關(guān)系。
[0156]第三確定子單元380與第一判斷子單元370連接,用于當(dāng)?shù)诙€程與第一線程構(gòu)成持鎖依賴關(guān)系時,確定由于線程間互鎖導(dǎo)致系統(tǒng)死鎖。進而由圖6或圖7對應(yīng)的實施例中的第一確定單元確定出構(gòu)成持鎖依賴關(guān)系的線程為互鎖的線程。
[0157]線程更新單元390連接在第一判斷子單元370和第二獲取子單元340之間,用于當(dāng)?shù)诙€程與第一線程未構(gòu)成持鎖依賴關(guān)系時,將持有第二線程所等待互斥鎖的線程作為新的第二線程,并觸發(fā)第二獲取子單元340獲取新的第二線程對應(yīng)的第二線程堆棧數(shù)據(jù)。[0158]相對于上述實施例提供的系統(tǒng)重啟原因的檢測方法和裝置,本公開還提供了終端設(shè)備。
[0159]請參見圖9,示出了本公開涉及的終端設(shè)備的結(jié)構(gòu)示意圖,該終端設(shè)備可以用于實施上述實施例中提供的系統(tǒng)重啟原因的檢測方法,具體而言:
[0160]終端設(shè)備可以包括RF (Radio Frequency,射頻)電路110、包括有一個或一個以上計算機可讀存儲介質(zhì)的存儲器120、輸入單元130、顯示單元140、傳感器150、音頻電路160、WiFi模塊170、包括有一個或者一個以上處理核心的處理器180、以及電源190等部件。本領(lǐng)域技術(shù)人員可以理解,圖9中示出的終端設(shè)備結(jié)構(gòu)并不構(gòu)成對終端設(shè)備的限定,可以包括比圖示更多或更少的部件,或者組合某些部件,或者不同的部件布置。其中:
[0161]RF電路110可用于收發(fā)信息或通話過程中,信號的接收和發(fā)送,特別地,將基站的下行信息接收后,交由一個或者一個以上處理器180處理;另外,將涉及上行的數(shù)據(jù)發(fā)送給基站。通常,RF電路110包括但不限于天線、至少一個放大器、調(diào)諧器、一個或多個振蕩器、用戶身份模塊(SIM)卡、收發(fā)信機、耦合器、LNA (Low Noise Amplifier,低噪聲放大器)、雙工器等。此外,RF電路110還可以通過無線通信與網(wǎng)絡(luò)和其他設(shè)備通信。該無線通信可以使用任一通信標(biāo)準(zhǔn)或協(xié)議,包括但不限于GSM(Global System of Mobile communication,全球移動通訊系統(tǒng))、GPRS (General Packet Radio Service,通用分組無線服務(wù))、CDMA(CodeDivision Multiple Access,石馬分多址)、WCDMA(Wideband Code Division MultipleAccess,寬帶碼分多址)、LTE (Long Term Evolution,長期演進)、電子郵件、SMS (ShortMessaging Service,短消息服務(wù))等。
[0162]存儲器120可用于存儲軟件程序以及模塊,處理器180通過運行存儲在存儲器120的軟件程序以及模塊,從而執(zhí)行各種功能應(yīng)用以及數(shù)據(jù)處理。存儲器120可主要包括存儲程序區(qū)和存儲數(shù)據(jù)區(qū),其中,存儲程序區(qū)可存儲操作系統(tǒng)、至少一個功能所需的應(yīng)用程序(比如聲音播放功能、圖像播放功能等)等;存儲數(shù)據(jù)區(qū)可存儲根據(jù)終端設(shè)備的使用所創(chuàng)建的數(shù)據(jù)(比如音頻數(shù)據(jù)、電話本等)等。此外,存儲器120可以包括高速隨機存取存儲器,還可以包括非易失性存儲器,例如至少一個磁盤存儲器件、閃存器件、或其他易失性固態(tài)存儲器件。相應(yīng)地,存儲器120還可以包括存儲器控制器,以提供處理器180和輸入單元130對存儲器120的訪問。
[0163]輸入單元130可用于接收輸入的數(shù)字或字符信息,以及產(chǎn)生與用戶設(shè)置以及功能控制有關(guān)的鍵盤、鼠標(biāo)、操作桿、光學(xué)或者軌跡球信號輸入。具體地,輸入單元130可以包括觸敏表面131以及其他輸入設(shè)備132。觸敏表面131,也稱為觸摸顯示屏或者觸控板,可收集用戶在其上或附近的觸摸操作(比如用戶使用手指、觸筆等任何適合的物體或附件在觸敏表面131上或在觸敏表面131附近的操作),并根據(jù)預(yù)先設(shè)定的程式驅(qū)動相應(yīng)的連接裝置??蛇x的,觸敏表面131可包括觸摸檢測裝置和觸摸控制器兩個部分。其中,觸摸檢測裝置檢測用戶的觸摸方位,并檢測觸摸操作帶來的信號,將信號傳送給觸摸控制器;觸摸控制器從觸摸檢測裝置上接收觸摸信息,并將它轉(zhuǎn)換成觸點坐標(biāo),再送給處理器180,并能接收處理器180發(fā)來的命令并加以執(zhí)行。此外,可以采用電阻式、電容式、紅外線以及表面聲波等多種類型實現(xiàn)觸敏表面131。除了觸敏表面131,輸入單元130還可以包括其他輸入設(shè)備132。具體地,其他輸入設(shè)備132可以包括但不限于物理鍵盤、功能鍵(比如音量控制按鍵、開關(guān)按鍵等)、軌跡球、鼠標(biāo)、操作桿等中的一種或多種。[0164]顯示單元140可用于顯示由用戶輸入的信息或提供給用戶的信息以及終端設(shè)備的各種圖形用戶接口,這些圖形用戶接口可以由圖形、文本、圖標(biāo)、視頻和其任意組合來構(gòu)成。顯示單元140可包括顯示面板141,可選的,可以采用IXD(Liquid Crystal Display,液晶顯示器)、OLED (Organic Light-Emitting Diode,有機發(fā)光二極管)等形式來配置顯示面板141。進一步的,觸敏表面131可覆蓋顯示面板141,當(dāng)觸敏表面131檢測到在其上或附近的觸摸操作后,傳送給處理器180以確定觸摸事件的類型,隨后處理器180根據(jù)觸摸事件的類型在顯示面板141上提供相應(yīng)的視覺輸出。雖然在圖9中,觸敏表面131與顯示面板141是作為兩個獨立的部件來實現(xiàn)輸入和輸入功能,但是在某些實施例中,可以將觸敏表面131與顯示面板141集成而實現(xiàn)輸入和輸出功能。
[0165]終端設(shè)備還可包括至少一種傳感器150,比如光傳感器、運動傳感器以及其他傳感器。具體地,光傳感器可包括環(huán)境光傳感器及接近傳感器,其中,環(huán)境光傳感器可根據(jù)環(huán)境光線的明暗來調(diào)節(jié)顯示面板141的亮度,接近傳感器可在終端設(shè)備移動到耳邊時,關(guān)閉顯不面板141和/或背光。作為運動傳感器的一種,重力加速度傳感器可檢測各個方向上(一般為三軸)加速度的大小,靜止時可檢測出重力的大小及方向,可用于識別手機姿態(tài)的應(yīng)用(比如橫豎屏切換、相關(guān)游戲、磁力計姿態(tài)校準(zhǔn))、振動識別相關(guān)功能(比如計步器、敲擊)等;至于終端設(shè)備還可配置的陀螺儀、氣壓計、濕度計、溫度計、紅外線傳感器等其他傳感器,在此不再贅述。
[0166]音頻電路160、揚聲器161,傳聲器162可提供用戶與終端設(shè)備之間的音頻接口。音頻電路160可將接收到的音頻數(shù)據(jù)轉(zhuǎn)換后的電信號,傳輸?shù)綋P聲器161,由揚聲器161轉(zhuǎn)換為聲音信號輸出;另一方面,傳聲器162將收集的聲音信號轉(zhuǎn)換為電信號,由音頻電路160接收后轉(zhuǎn)換為音頻數(shù)據(jù),再將音頻數(shù)據(jù)輸出處理器180處理后,經(jīng)RF電路110以發(fā)送給比如另一終端設(shè)備,或者將音頻數(shù)據(jù)輸出至存儲器120以便進一步處理。音頻電路160還可能包括耳塞插孔,以提供外設(shè)耳機與終端設(shè)備的通信。
[0167]WiFi屬于短距離無線傳輸技術(shù),終端設(shè)備通過WiFi模塊170可以幫助用戶收發(fā)電子郵件、瀏覽網(wǎng)頁和訪問流式媒體等,它為用戶提供了無線的寬帶互聯(lián)網(wǎng)訪問。雖然圖9示出了 WiFi模塊170,但是可以理解的是,其并不屬于終端設(shè)備的必須構(gòu)成,完全可以根據(jù)需要在不改變發(fā)明的本質(zhì)的范圍內(nèi)而省略。
[0168]處理器180是終端設(shè)備的控制中心,利用各種接口和線路連接整個手機的各個部分,通過運行或執(zhí)行存儲在存儲器120內(nèi)的軟件程序和/或模塊,以及調(diào)用存儲在存儲器120內(nèi)的數(shù)據(jù),執(zhí)行終端設(shè)備的各種功能和處理數(shù)據(jù),從而對手機進行整體監(jiān)控??蛇x的,處理器180可包括一個或多個處理核心;優(yōu)選的,處理器180可集成應(yīng)用處理器和調(diào)制解調(diào)處理器,其中,應(yīng)用處理器主要處理操作系統(tǒng)、用戶界面和應(yīng)用程序等,調(diào)制解調(diào)處理器主要處理無線通信??梢岳斫獾氖?,上述調(diào)制解調(diào)處理器也可以不集成到處理器180中。
[0169]終端設(shè)備還包括給各個部件供電的電源190 (比如電池),優(yōu)選的,電源可以通過電源管理系統(tǒng)與處理器180邏輯相連,從而通過電源管理系統(tǒng)實現(xiàn)管理充電、放電、以及功耗管理等功能。電源190還可以包括一個或一個以上的直流或交流電源、再充電系統(tǒng)、電源故障檢測電路、電源轉(zhuǎn)換器或者逆變器、電源狀態(tài)指示器等任意組件。
[0170]盡管未示出,終端設(shè)備還可以包括攝像頭、藍牙模塊等,在此不再贅述。在本實施例中,終端設(shè)備的顯示單元時觸摸屏顯示器。[0171]所述終端設(shè)備還包括一個或者一個以上的指令(instruction或program),其中一個或者一個以上指令存儲于存儲器中,且經(jīng)配置以由一個或者一個以上處理器執(zhí)行所述一個或者一個以上指令所包含用于進行以下操作的指令:
[0172]獲取系統(tǒng)日志文件;
[0173]查找所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息;
[0174]當(dāng)系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息時,獲取線程堆棧數(shù)據(jù),并根據(jù)所述線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因;
[0175]當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為由于線程間互鎖時,確定互鎖的線程;
[0176]當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。
[0177]較佳地,所述一個或者一個以上指令還包括用于進行以下操作的指令:
[0178]查找所述強制結(jié)束系統(tǒng)進程的進程消息中是否包含線程名稱,當(dāng)所述強制結(jié)束系統(tǒng)進程的進程消息中包含線程名稱時,執(zhí)行獲取線程堆棧數(shù)據(jù)的步驟;當(dāng)不包含線程名稱時,確定線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
[0179]較佳地,所述一個或者一個以上指令還包括用于進行以下操作的指令:
[0180]獲取進程消息中第一線程對應(yīng)的第一線程堆棧數(shù)據(jù);
[0181]查找所述第一線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息,所述等待互斥鎖消息包含持有第一線程所等待互斥鎖的第二線程;
[0182]當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第一線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖;
[0183]當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)存在等待互斥鎖消息時,獲取持有第一線程所等待互斥鎖的第二線程對應(yīng)的第二線程堆棧數(shù)據(jù);
[0184]查找所述第二線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息;
[0185]當(dāng)?shù)诙€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第二線程持鎖時間過長導(dǎo)致系統(tǒng)死鎖;
[0186]當(dāng)?shù)诙€程堆棧數(shù)據(jù)包含等待互斥鎖消息時,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系;
[0187]當(dāng)?shù)诙€程與第一線程構(gòu)成持鎖依賴關(guān)系時,確定由于線程間互鎖導(dǎo)致系統(tǒng)死鎖;
[0188]當(dāng)?shù)诙€程與第一線程未構(gòu)成持鎖依賴關(guān)系時,將持有第二線程所等待互斥鎖的線程作為新的第二線程,返回執(zhí)行獲取新的第二線程對應(yīng)第二線程堆棧數(shù)據(jù)。
[0189]在本公開的一個可能的實施例中,所述一個或者一個以上指令還包括用于進行以下操作的指令:
[0190]判斷第一線程持有的互斥鎖是否是第二線程所等待的互斥鎖;
[0191]當(dāng)?shù)谝痪€程持有的互斥鎖是第二線程所等待的互斥鎖時,確定第一線程和第二線程間構(gòu)成持鎖依賴關(guān)系;并確定構(gòu)成持鎖依賴關(guān)系的線程為互鎖的線程。
[0192]當(dāng)?shù)谝痪€程持有的互斥鎖不是第二線程所等待的互斥鎖時,確定第一線程和第二線程間未構(gòu)成持鎖依賴關(guān)系。
[0193]在本公開的另一個可能的實施例中,所述一個或者一個以上指令還包括用于進行以下操作的指令:
[0194]根據(jù)獲得的線程堆棧數(shù)據(jù)中的等待互斥鎖消息,構(gòu)建持鎖依賴關(guān)系圖數(shù)據(jù);
[0195]判斷所述持鎖依賴關(guān)系圖數(shù)據(jù)中是否存在環(huán)路,如果所述持鎖依賴關(guān)系圖數(shù)據(jù)存在環(huán)路,確定由于環(huán)路上的各個線程構(gòu)成持鎖依賴關(guān)系。并確定構(gòu)成持鎖依賴關(guān)系的線程為互鎖的線程。
[0196]本公開還提供一種計算機可讀存儲介質(zhì),該計算機可讀存儲介質(zhì)可以是上述實施例中的存儲器中所包含的計算機可讀存儲介質(zhì);也可以是單獨存在,未裝配入終端中的計算機可讀存儲介質(zhì)。所述計算機可讀存儲介質(zhì)存儲有一個或者一個以上指令,所述一個或者一個以上指令被一個或者一個以上的處理器用來執(zhí)行圖2、圖3、圖4、圖5所示實施例所提供的系統(tǒng)重啟原因的檢測方法。
[0197]本領(lǐng)域的技術(shù)人員可以清楚地了解到本公開實施例中的技術(shù)可借助軟件加必需的通用硬件平臺的方式來實現(xiàn)?;谶@樣的理解,本公開實施例中的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如R0M/RAM、磁碟、光盤等,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本公開各個實施例或者實施例的某些部分所述的方法。
[0198]本說明書中的各個實施例均采用遞進的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對于系統(tǒng)實施例而言,由于其基本相似于方法實施例,所以描述的比較簡單,相關(guān)之處參見方法實施例的部分說明即可。
[0199]以上所述的本公開實施方式,并不構(gòu)成對本公開保護范圍的限定。任何在本公開的精神和原則之內(nèi)所作的修改、等同替換和改進等,均應(yīng)包含在本公開的保護范圍之內(nèi)。
【權(quán)利要求】
1.一種系統(tǒng)重啟原因的檢測方法,其特征在于,包括: 獲取系統(tǒng)日志文件; 查找所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息; 當(dāng)系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息時,獲取線程堆棧數(shù)據(jù),并根據(jù)所述線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因; 當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程間互鎖時,確定互鎖的線程; 當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,還包括: 查找所述強制結(jié)束系統(tǒng)進程的進程消息中是否包含線程名稱,當(dāng)所述強制結(jié)束系統(tǒng)進程的進程消息中包含線程名稱時,執(zhí)行獲取線程堆棧數(shù)據(jù)的步驟;當(dāng)不包含線程名稱時,確定線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,獲取線程堆棧數(shù)據(jù),并根據(jù)所述線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因的步驟,采用如下方式: 獲取所述進程消息中第一線程對應(yīng)的第一線程堆棧數(shù)據(jù); 查找所述第一線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息,所述等待互斥鎖消息包含持有第一線程所等待互斥鎖的第二線程; 當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第一線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖; 當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)存在等待互斥鎖消息時,獲取持有第一線程所等待互斥鎖的第二線程對應(yīng)的第二線程堆棧數(shù)據(jù); 查找所述第二線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息; 當(dāng)?shù)诙€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第二線程持鎖時間過長導(dǎo)致系統(tǒng)死鎖; 當(dāng)?shù)诙€程堆棧數(shù)據(jù)包含等待互斥鎖消息時,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系; 當(dāng)?shù)诙€程與第一線程構(gòu)成持鎖依賴關(guān)系時,確定由于線程間互鎖導(dǎo)致系統(tǒng)死鎖;當(dāng)?shù)诙€程與第一線程未構(gòu)成持鎖依賴關(guān)系時,將持有第二線程所等待互斥鎖的線程作為新的第二線程,返回執(zhí)行獲取新的第二線程對應(yīng)第二線程堆棧數(shù)據(jù)。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系的步驟,采用如下方式: 判斷第一線程持有的互斥鎖是否是第二線程所等待的互斥鎖; 當(dāng)?shù)谝痪€程持有的互斥鎖是第二線程所等待的互斥鎖時,確定第一線程和第二線程間構(gòu)成持鎖依賴關(guān)系; 當(dāng)?shù)谝痪€程持有的互斥鎖不是第二線程所等待的互斥鎖時,確定第一線程和第二線程間未構(gòu)成持鎖依賴關(guān)系。
5.根據(jù)權(quán)利要求3所述的方法,其特征在于,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系的步驟,采用如下方式: 根據(jù)獲得的線程堆棧數(shù)據(jù)中的等待互斥鎖消息,構(gòu)建持鎖依賴關(guān)系圖數(shù)據(jù);判斷所述持鎖依賴關(guān)系圖數(shù)據(jù)中是否存在環(huán)路,如果所述持鎖依賴關(guān)系圖數(shù)據(jù)存在環(huán)路,確定由于環(huán)路上的各個線程構(gòu)成持鎖依賴關(guān)系。
6.根據(jù)權(quán)利要求4或5所述的方法,其特征在于,確定構(gòu)成持鎖依賴關(guān)系的線程為互鎖的線程。
7.一種系統(tǒng)重啟原因的檢測裝置,其特征在于,包括: 第一獲取單兀,用于獲取系統(tǒng)日志文件; 第一查找單元,用于所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息; 第二獲取單元,用于當(dāng)所述系統(tǒng)日志文件包含強制結(jié)束系統(tǒng)進程的進程消息時,獲取線程堆棧數(shù)據(jù),并根據(jù)獲得的線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因; 第一確定單元,用于當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程間互鎖時,確定互鎖的線程; 第二確定單元,用于當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。
8.根據(jù)權(quán)利要求7所述的系統(tǒng)重啟原因的檢測裝置,其特征在于,還包括: 第二查找單元,用于查找所述強制結(jié)束系統(tǒng)進程的進程消息中是否包含線程名稱,當(dāng)所述強制結(jié)束系統(tǒng)進程的進程消息中包含線程名稱時,觸發(fā)第二獲取單元獲取線程堆棧數(shù)據(jù);當(dāng)不包含線程名稱時,確定線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖。
9.根據(jù)權(quán)利要求7或8所述的系統(tǒng)重啟原因的檢測裝置,其特征在于,所述第二獲取單元包括: 第一獲取子單元,用于獲取所述進程消息中第一線程對應(yīng)的第一線程堆棧數(shù)據(jù); 第一查找子單元,用于查找所述第一線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息,所述等待互斥鎖消息包含持有第一線程所等待互斥鎖的第二線程; 第一確定子單元,用于當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第一線程持鎖時間超過預(yù)設(shè)時間導(dǎo)致系統(tǒng)死鎖; 第二獲取子單元,用于當(dāng)?shù)谝痪€程堆棧數(shù)據(jù)存在等待互斥鎖消息時,獲取持有第一線程所等待互斥鎖的第二線程對應(yīng)的第二線程堆棧數(shù)據(jù); 第二查找子單元,用于查找所述第二線程堆棧數(shù)據(jù)中是否包含等待互斥鎖消息; 第二確定子單元,用于當(dāng)?shù)诙€程堆棧數(shù)據(jù)不包含等待互斥鎖消息時,確定第二線程持鎖時間過長導(dǎo)致系統(tǒng)死鎖; 第一判斷子單元,用于當(dāng)?shù)诙€程堆棧數(shù)據(jù)包含等待互斥鎖消息時,判斷第二線程與第一線程是否構(gòu)成持鎖依賴關(guān)系; 第三確定子單元,用于當(dāng)?shù)诙€程與第一線程構(gòu)成持鎖依賴關(guān)系時,確定由于線程間互鎖導(dǎo)致系統(tǒng)死鎖; 線程更新單元,用于當(dāng)?shù)诙€程與第一線程未構(gòu)成持鎖依賴關(guān)系時,將持有第二線程所等待互斥鎖的線程作為新的第二線程,并觸發(fā)第二獲取子單元獲取新的第二線程對應(yīng)的第二線程堆棧數(shù)據(jù)。
10.根據(jù)權(quán)利要求9所述的系統(tǒng)重啟原因的檢測裝置,其特征在于,所述第一判斷子單元包括: 第二判斷子單元,用于判斷第一線程持有的互斥鎖是否是第二線程所等待的互斥鎖; 第四確定子單元,用于當(dāng)?shù)谝痪€程持有的互斥鎖是第二線程所等待的互斥鎖時,確定第一線程和第二線程間構(gòu)成持鎖依賴關(guān)系;或者,當(dāng)?shù)谝痪€程持有的互斥鎖不是第二線程所等待的互斥鎖時,確定第一線程和第二線程間未構(gòu)成持鎖依賴關(guān)系。
11.根據(jù)權(quán)利要求9所述的系統(tǒng)重啟原因的檢測裝置,其特征在于,所述第一判斷子單元包括: 構(gòu)建單元,用于根據(jù)獲得的線程堆棧數(shù)據(jù)中的等待互斥鎖消息,構(gòu)建持鎖依賴關(guān)系圖數(shù)據(jù); 第三判斷子單元,用于判斷所述持鎖依賴關(guān)系圖數(shù)據(jù)中是否存在環(huán)路; 第五確定子單元,用于當(dāng)所述持鎖依賴關(guān)系圖數(shù)據(jù)存在環(huán)路時,確定環(huán)路上的各個線程構(gòu)成持鎖依賴關(guān)系。
12.根據(jù)權(quán)利要求10或11所述的系統(tǒng)重啟原因的檢測裝置,其特征在于,第一確定單元配置為確定構(gòu)成持鎖依賴關(guān)系的線程為互鎖的線程。
13.—種終端設(shè)備,其特征在于,包括存儲器,以及一個或者一個以上的指令,其中一個或者一個以上指令存儲于存儲器中,且經(jīng)配置以由一個或者一個以上處理器執(zhí)行所述一個或者一個以上指令所包含用于進行以下操作的指令: 獲取系統(tǒng)日志文件; 查找所述系統(tǒng)日志文件中是否包含強制結(jié)束系統(tǒng)進程的進程消息; 當(dāng)系統(tǒng)日志文件中包含強制結(jié)束系統(tǒng)進程的進程消息時,獲取線程堆棧數(shù)據(jù),并根據(jù)所述線程堆棧數(shù)據(jù)獲取導(dǎo)致系統(tǒng)死鎖的原因; 當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為由于線程間互鎖時,確定互鎖的線程; 當(dāng)導(dǎo)致系統(tǒng)死鎖的原因為線程持鎖時間超過預(yù)設(shè)時間時,確定持鎖時間超過預(yù)設(shè)時間的線程。
【文檔編號】G06F11/07GK103942113SQ201310594935
【公開日】2014年7月23日 申請日期:2013年11月21日 優(yōu)先權(quán)日:2013年11月21日
【發(fā)明者】李明浩, 袁軍, 梁金祥, 閆昊 申請人:小米科技有限責(zé)任公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1