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);