lua指令碼的PANIC函式

2021-07-12 03:37:24 字數 716 閱讀 4753

最近線上的伺服器程式偶爾會出現崩潰問題,總是提示記憶體不足,根據記錄資訊,每次崩潰時必出現一行**:

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

Lua 指令碼呼叫 C 函式

上篇說到 c 程式裡呼叫lua 函式,此篇講lua 指令碼裡呼叫c 函式。lua要呼叫c 程式裡的函式,這些函式必須有同樣的原型 typedef int luafunc lua state l 結合工作上的業務來實現乙個簡單的lua 呼叫 c 函式的例子,業務是上這樣的,有一可攜式裝置向我們的裝置傳...

go語言panic函式詳解

程式異常被叫做panic,直譯為執行時恐慌 當panic被丟擲異常後,如果我們沒有在程式中新增任何保護措施的話,程式就會列印出panic的詳細情況之後,終止執行 panic runtime error index out of range goroutine 1 running main.main ...

lua解析lua指令碼

lua中使用loadstring可以直接以字串形式執行 loadfile可以直接解析 為lua function.如果乙個lua資料檔案有結尾返回例如 return sound 則可以直接使用 dofile來執行檔案,執行結果就是sound table。如果lua資料檔案沒有返回值,dofile不可...