使用ulua等unity lua 腳本接口工具時,常常會出現各類崩潰c++
這些崩潰本質上有一個共同模式: C#調用 Lua, Lua調用c#, 接着C#出現異常c#
也就是跨語言 異常處理上 存在嚴重問題;工具
ulua,slua等 庫 都抄襲了一個叫作 LuaInterface的庫, 而這個異常傳遞致使崩潰的問題,就是LuaInterface自身 設計的問題lua
修改起來也很簡單,避免將C#層的異常,拋給Lua去處理操作系統
直接在C#層打印Log,也能夠將當前Lua堆棧打Log,同時向Lua層返回一個 nil便可設計
這個問題本質緣由是:接口
Lua若是使用c編譯,使用的longjmp方式處理的異常,c++編譯器的話,使用的是c++本身的異常機制;圖片
而C# 是託管代碼,走的是Mono虛擬機上的異常處理,get
而異常處理,本質上仍是要借用 操做系統級別上的 接口編譯器
當異常發生的時候,Mono須要 作一次上下文的長跳轉,將C#堆棧還原到特定位置,同時須要將 CPU的關鍵寄存器狀態進行還原,C層堆棧進行還原
這裏咱們就會看到嚴重的問題,lua的異常機制會對c層,操做系統層堆棧進行處理,而Mono虛擬機也會對操做系統層堆棧進行處理, 咱們都知道,兩個不會考慮彼此的系統,同時操做一個東西,將會形成怎樣的後果
所以咱們得出了一個通用方案:
任何跨語言的操做,都要避免異常傳遞, 例如C++調用C#,C#須要本身捕獲異常,lua調用c# c#調用lua 都須要將異常在語言內部消化,而不要外漏
參考:
http://www.mono-project.com/docs/advanced/runtime/docs/exception-handling/