本發(fā)明涉及計算機領(lǐng)域,特別涉及一種網(wǎng)絡(luò)游戲服務(wù)器防崩潰方法和系統(tǒng)。
背景技術(shù):
在Linux系統(tǒng)進行游戲開發(fā)時,出于腳本穩(wěn)定性的考慮,很多開發(fā)者會選擇腳本語言作為游戲開發(fā)的主要語言,因為腳本語言支持熱更的天然優(yōu)勢,使得即使游戲出現(xiàn)重大bug,開發(fā)者也能迅速解決,然而,當(dāng)大量采用腳本語言時,卻不得不面對腳本性能低下的問題,面對服務(wù)器性能要求特別高的游戲時,性能低下的腳本語言邏輯的體驗相當(dāng)差,玩家會在游戲過程中,感覺到明顯的停頓感。而面對腳本語言的性能問題,現(xiàn)有技術(shù)卻沒有有效的解決辦法;而由于C/C++自己本身語言的特性,使用C/C++來開發(fā),可大大提高性能,但是如果程序不嚴(yán)謹(jǐn)?shù)那闆r下,會發(fā)生系統(tǒng)崩潰,因為C/C++目前不存在熱更新的接口,就需要重啟服務(wù)器來實現(xiàn)錯誤更新,這對系統(tǒng)穩(wěn)定性要求比較高的服務(wù)器來說,是難以接受的,每次的服務(wù)器進程崩潰帶來的損失也非常大。
技術(shù)實現(xiàn)要素:
為此,需要提供一種網(wǎng)絡(luò)游戲服務(wù)器防崩潰方法和系統(tǒng),用以解決游戲開發(fā)使用C/C++語言,系統(tǒng)發(fā)生崩潰時需重啟游戲服務(wù)器來更新錯誤的問題。
為實現(xiàn)上述目的,發(fā)明人提供了一種網(wǎng)絡(luò)游戲服務(wù)器防崩潰方法,具體的技術(shù)方案如下:
一種網(wǎng)絡(luò)游戲服務(wù)器防崩潰方法,包括步驟:注冊接收Linux系統(tǒng)異常的處理函數(shù);所述處理函數(shù)創(chuàng)建當(dāng)前運行線程的內(nèi)存對象,并打上標(biāo)記;所述處理函數(shù)接收Linux系統(tǒng)異常信息,并檢測所述異常信息對應(yīng)的線程的內(nèi)存對象,判斷該線程的內(nèi)存對象是否有被打上所述標(biāo)記,若有,拋出所述處理函數(shù)自定義的異常信息并打印當(dāng)前異常的堆棧信息;所述處理函數(shù)接收自定義的異常信息,并跳過異常邏輯,程序繼續(xù)運行。
進一步的,為了快速定位出當(dāng)前異常是由哪行代碼引起的,幫助開發(fā)人員快速解決問題。打印當(dāng)前異常的堆棧信息,還包括步驟:打印當(dāng)前異常堆棧信息并產(chǎn)生對應(yīng)日志,轉(zhuǎn)換所述日志中打印的內(nèi)存地址為代碼中的行數(shù),將生成的行數(shù)保存為一個文件,所述文件與所述日志一一對應(yīng)。
進一步的,為了讓程序繼續(xù)正常運行。運行當(dāng)前線程前,存儲當(dāng)前運行線程的運行堆棧。
進一步的,所述處理函數(shù)接收自定義的異常信息,并跳過異常邏輯,程序繼續(xù)運行,還包括步驟:所述處理函數(shù)根據(jù)運行當(dāng)前線程前存儲當(dāng)前運行線程的運行堆棧,執(zhí)行下一步的業(yè)務(wù)邏輯。
進一步的,所述處理函數(shù)自定義的異常信息為IException類型。
為實現(xiàn)上述目的,發(fā)明人還提供了一種網(wǎng)絡(luò)游戲服務(wù)器防崩潰系統(tǒng),具體的技術(shù)方案如下:
一種網(wǎng)絡(luò)游戲服務(wù)器防崩潰系統(tǒng),包括:系統(tǒng)異常檢測單元和系統(tǒng)異常處理單元;所述系統(tǒng)異常檢測單元用于:注冊接收Linux系統(tǒng)異常的處理函數(shù);所述處理函數(shù)創(chuàng)建當(dāng)前運行線程的內(nèi)存對象,并打上標(biāo)記;所述處理函數(shù)接收Linux系統(tǒng)異常信息,并檢測所述異常信息對應(yīng)的線程的內(nèi)存對象,判斷該線程的內(nèi)存對象是否有被打上所述標(biāo)記;所述系統(tǒng)異常處理單元用于:若線程的內(nèi)存對象有被打上所述標(biāo)記,拋出所述處理函數(shù)自定義的異常信息并打印當(dāng)前異常的堆棧信息;還用于接收自定義的異常信息,并跳過異常邏輯,程序繼續(xù)運行。
進一步的,所述系統(tǒng)異常處理單元還用于:打印當(dāng)前異常堆棧信息并產(chǎn)生對應(yīng)日志,轉(zhuǎn)換所述日志中打印的內(nèi)存地址為代碼中的行數(shù),將生成的行數(shù)保存為一個文件,所述文件與所述日志一一對應(yīng)。
進一步的,所述系統(tǒng)異常檢測單元還用于:運行當(dāng)前線程前,存儲當(dāng)前運行線程的運行堆棧。
進一步的,所述系統(tǒng)異常處理單元還用于:根據(jù)運行當(dāng)前線程前存儲當(dāng)前運行線程的運行堆棧,執(zhí)行下一步的業(yè)務(wù)邏輯。
進一步的,所述處理函數(shù)自定義的異常信息為IException類型。
本發(fā)明的有益效果是:開發(fā)人員自己研發(fā)了處理函數(shù),其會給每個當(dāng)前運行線程打上特定標(biāo)記,當(dāng)有系統(tǒng)異常發(fā)生時,會捕獲系統(tǒng)異常,當(dāng)判斷到是程序本身引發(fā)的系統(tǒng)異常時,會對系統(tǒng)異常堆棧信息進行記錄,以方便開發(fā)人員查找錯誤情況;并且會拋出處理函數(shù)自己定義的異常信息,處理函數(shù)接收到自己的異常信息,就會讓程序跳過異常點,繼續(xù)正常運行的機制,確保了系統(tǒng)穩(wěn)定性,避免服務(wù)器進程崩潰。解決了系統(tǒng)異常發(fā)生時,就必須重啟服務(wù)器解決問題的情況。同時通過對運行線程進行標(biāo)記,也避免了誤報非本程序引發(fā)系統(tǒng)異常的情況。
附圖說明
圖1為本發(fā)明一種網(wǎng)絡(luò)游戲服務(wù)器防崩潰方法的流程圖一;
圖2為本發(fā)明一種網(wǎng)絡(luò)游戲服務(wù)器防崩潰方法的流程圖二;
圖3為本發(fā)明一種網(wǎng)絡(luò)游戲服務(wù)器防崩潰系統(tǒng)的模塊圖。
附圖標(biāo)記說明:
301、系統(tǒng)異常檢測單元,
302、系統(tǒng)異常處理單元。
具體實施方式
為詳細(xì)說明技術(shù)方案的技術(shù)內(nèi)容、構(gòu)造特征、所實現(xiàn)目的及效果,以下結(jié)合具體實施例并配合附圖詳予說明。
首先對一些名詞做下解釋:
try{}catch{}邏輯:在try{}語句執(zhí)行的過程中,如果接收到catch{}里的異常,就會跳出try方法。
在本實施例中,為了使用方便,定義了兩個別名DEBUG_TRY和DEBUG_CATCH,其中DEBUG_CATCH就是用來捕捉異常
請參閱圖1,本實施例中一種網(wǎng)絡(luò)游戲服務(wù)器防崩潰方法的實現(xiàn)具體如下:
步驟S101:注冊接收Linux系統(tǒng)異常的處理函數(shù);首先在程序啟動時,發(fā)明人先定義好接收Linux系統(tǒng)異常的處理函數(shù)。
定義好后,進入步驟S102:處理函數(shù)創(chuàng)建當(dāng)前運行線程的內(nèi)存對象,并打上印記。這邊打印記是為了確保后續(xù)接收到系統(tǒng)發(fā)生異常時,可以通過判斷線程的內(nèi)存對象是否有我們打上的印記來判斷是否為本程序引發(fā)的系統(tǒng)異常,使得異常接收和處理更有針對性。
打好印記后,就開始正常運行業(yè)務(wù)邏輯,當(dāng)有系統(tǒng)異常發(fā)生時,進入步驟S103:處理函數(shù)接收系統(tǒng)異常信息。
接收后,進入步驟S104:判斷線程的內(nèi)存對象是否有被打上所述標(biāo)記;因為系統(tǒng)發(fā)生異常由可能不是由本程序引起的,可能是其它程序引發(fā),也有可能是系統(tǒng)自己本身的問題,因此需要對線程內(nèi)存對象進行判斷,如果有打上所述標(biāo)記,就說明是本程序的運行線程。
所以如果判斷到有打上標(biāo)記,進入步驟S105:拋出所述處理函數(shù)自定義的異常信息并打印當(dāng)前異常的堆棧信息;處理函數(shù)自定義了異常信息,在接收到本程序引發(fā)的系統(tǒng)異常的時候,都會拋出處理函數(shù)自定義的異常信息,在本實施例中,所述處理函數(shù)自定義的異常信息為IException類型。并且打印當(dāng)前異常的堆棧信息,便于后續(xù)對異常信息進行分析解決。如果判斷到?jīng)]有打上標(biāo)記,則說明是系統(tǒng)自己本身的錯誤,非本程序出錯,程序直接崩潰,不做任何處理。
在某些實施例中,可以根據(jù)接收到的系統(tǒng)異常的錯誤類型,拋出不同的錯誤級別,程序根據(jù)錯誤級別,做出不同的應(yīng)對。比如對錯誤級別可以進行分類為:一般錯誤級別和嚴(yán)重錯誤級別;如果接受到的是普通的錯誤級別,除了打印日志,不做其他任何處理;如果是嚴(yán)重的錯誤級別,除了打印日志,程序還會直接讓觸發(fā)錯誤的玩家下線。通過這樣的級別判斷,針對性處理,不僅可以節(jié)省計算機資源,而且可以避免玩家不知情情況下繼續(xù)重復(fù)一些嚴(yán)重的錯誤給服務(wù)器帶來一些大的攻擊影響。
拋出自己的異常信息后,進入步驟S106:處理函數(shù)接收自定義的異常信息,并跳過異常邏輯,程序繼續(xù)運行。本實施例中采用的是try{}和catch{}邏輯,當(dāng)拋出程序自定義的異常信息時,就會被DEBUG_CATCH接收到,然后就會直接跳到DEBUG_CATCH之后,程序繼續(xù)正常運行。
整個過程中,處理函數(shù),其會給每個當(dāng)前運行線程打上特定標(biāo)記,當(dāng)有系統(tǒng)異常發(fā)生時,會捕獲系統(tǒng)異常,當(dāng)判斷到是程序本身引發(fā)的系統(tǒng)異常時,會對系統(tǒng)異常堆棧信息進行記錄,以方便開發(fā)人員查找錯誤情況;并且會拋出處理函數(shù)自己定義的異常信息,處理函數(shù)接收到自己的異常信息,就會讓程序跳過異常點,繼續(xù)正常運行的機制,確保了系統(tǒng)穩(wěn)定性,避免服務(wù)器進程崩潰。解決了系統(tǒng)異常發(fā)生時,就必須重啟服務(wù)器解決問題的情況。同時通過對運行線程進行標(biāo)記,也避免了誤報非本程序引發(fā)系統(tǒng)異常的情況。
在本實施例中,為了方便開發(fā)人員對引發(fā)系統(tǒng)異常原因進行快速定位分析。在步驟S201:打印當(dāng)前異常堆棧信息并產(chǎn)生對應(yīng)日志;比如在2016-10-28:15:58這個時間發(fā)生了系統(tǒng)異常,程序會打印當(dāng)前異常堆棧信息,并生成對應(yīng)日志,在本實施例中,日志以發(fā)生的時間命名。
生成對應(yīng)日志后,進入步驟S202:轉(zhuǎn)換所述日志中打印的內(nèi)存地址為代碼中的行數(shù);日志中打印的內(nèi)存地址,可被直接轉(zhuǎn)換為代碼中的行數(shù),這樣便于查找邏輯代碼的崩潰點。
并且在步驟S203:將生成的行數(shù)保存為一個文件;程序會自動生成一個文件,用來存放這所有的行數(shù)。文件中在每一行內(nèi)存地址的后面,增加了本行內(nèi)存地址對應(yīng)的邏輯代碼行號,這樣程序員就可以快速的找到程序崩潰的行數(shù),查詢崩潰原因。
在某些實施例中,為了讓程序即便在遇到系統(tǒng)異常時,也可以繼續(xù)執(zhí)行,會在運行當(dāng)前線程前,存儲當(dāng)前運行線程的運行堆棧。這樣異常發(fā)生時,仍然可以依據(jù)當(dāng)前運行線程的運行堆棧來找到下一步要執(zhí)行的業(yè)務(wù)邏輯,讓程序繼續(xù)運行。
在某些實施例中,一種網(wǎng)絡(luò)游戲服務(wù)器防崩潰系統(tǒng),包括:系統(tǒng)異常檢測單元301和系統(tǒng)異常處理單元302;所述系統(tǒng)異常檢測單元301用于:注冊接收Linux系統(tǒng)異常的處理函數(shù);所述處理函數(shù)創(chuàng)建當(dāng)前運行線程的內(nèi)存對象,并打上標(biāo)記;所述處理函數(shù)接收Linux系統(tǒng)異常信息,并檢測所述異常信息對應(yīng)的線程的內(nèi)存對象,判斷該線程的內(nèi)存對象是否有被打上所述標(biāo)記;所述系統(tǒng)異常處理單元302用于:若線程的內(nèi)存對象有被打上所述標(biāo)記,拋出所述處理函數(shù)自定義的異常信息并打印當(dāng)前異常的堆棧信息;還用于接收自定義的異常信息,并跳過異常邏輯,程序繼續(xù)運行。
所述系統(tǒng)異常處理單元302還用于:打印當(dāng)前異常堆棧信息并產(chǎn)生對應(yīng)日志,轉(zhuǎn)換所述日志中打印的內(nèi)存地址為代碼中的行數(shù),將生成的行數(shù)保存為一個文件,所述文件與所述日志一一對應(yīng)。
所述系統(tǒng)異常檢測單元301還用于:運行當(dāng)前線程前,存儲當(dāng)前運行線程的運行堆棧。
所述系統(tǒng)異常處理單元302還用于:根據(jù)運行當(dāng)前線程前存儲當(dāng)前運行線程的運行堆棧,執(zhí)行下一步的業(yè)務(wù)邏輯。
所述處理函數(shù)自定義的異常信息為IException類型。
需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個實體或者操作與另一個實體或操作區(qū)分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者終端設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者終端設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括……”或“包含……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者終端設(shè)備中還存在另外的要素。此外,在本文中,“大于”、“小于”、“超過”等理解為不包括本數(shù);“以上”、“以下”、“以內(nèi)”等理解為包括本數(shù)。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,上述各實施例可提供為方法、裝置、或計算機程序產(chǎn)品。這些實施例可采用完全硬件實施例、完全軟件實施例、或結(jié)合軟件和硬件方面的實施例的形式。上述各實施例涉及的方法中的全部或部分步驟可以通過程序來指令相關(guān)的硬件來完成,所述的程序可以存儲于計算機設(shè)備可讀取的存儲介質(zhì)中,用于執(zhí)行上述各實施例方法所述的全部或部分步驟。所述計算機設(shè)備,包括但不限于:個人計算機、服務(wù)器、通用計算機、專用計算機、網(wǎng)絡(luò)設(shè)備、嵌入式設(shè)備、可編程設(shè)備、智能移動終端、智能家居設(shè)備、穿戴式智能設(shè)備、車載智能設(shè)備等;所述的存儲介質(zhì),包括但不限于:RAM、ROM、磁碟、磁帶、光盤、閃存、U盤、移動硬盤、存儲卡、記憶棒、網(wǎng)絡(luò)服務(wù)器存儲、網(wǎng)絡(luò)云存儲等。
上述各實施例是參照根據(jù)實施例所述的方法、設(shè)備(系統(tǒng))、和計算機程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計算機程序指令到計算機設(shè)備的處理器以產(chǎn)生一個機器,使得通過計算機設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機程序指令也可存儲在能引導(dǎo)計算機設(shè)備以特定方式工作的計算機設(shè)備可讀存儲器中,使得存儲在該計算機設(shè)備可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機程序指令也可裝載到計算機設(shè)備上,使得在計算機設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計算機實現(xiàn)的處理,從而在計算機設(shè)備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
盡管已經(jīng)對上述各實施例進行了描述,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對這些實施例做出另外的變更和修改,所以以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利保護范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運用在其他相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護范圍之內(nèi)。