lua腳本的PANIC函數

最近線上的服務器程序偶爾會出現崩潰問題,總是提示內存不足,根據記錄信息,每次崩潰時必出現一行代碼:

PANIC: unprotected error in call to Lua API (not enough memory)。

內存不足無非就是請求返回的數據量太大,超過了服務器的內存導致。


這個PANIC信息很關鍵,要解決這個問題,得先了解lua的異常處理機制:

lua提供的接口分兩大類:

一類是非保護模式的接口(如lua_pushstring),這些接口裏面出現的異常全部交給lua自身的PANIC函數進行處理;

另一類是保護模式的接口(如lua_pcall),這些接口中出現的異常可以人爲地拋出來,讓外層的程序顯示catch到,把異常交給外層的程序處理。


我說的服務器程序爲什麼會莫名奇妙的被終止呢?

原因:當PANIC函數被lua調用之後,lua會調用abort()函數終止進程,abort的調用是在core文件中的堆棧信息發現的。

解決方案:我們可以定義自己的panic函數,處理非保護模式下出現的異常,這樣可以避免lua調用abort(), 服務器程序也就不會被終止了。

定義自己的panic接口:

static int newPani(...)

{

........

}


然後我們需要把這個自定義的newPanic指定到lua中,在程序中加上這樣代碼:lua_atpanic(m_pLuaState, newPanic);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章