ulua,slua,tolua,xlua 等跨语言C#Lua 接口崩溃原因

Wesley13
• 阅读 636

使用ulua等unity lua 脚本接口工具时,经常会出现各种崩溃

这些崩溃本质上有一个共同模式: C#调用 Lua, Lua调用c#, 接着C#出现异常

也就是跨语言 异常处理上 存在严重问题;

ulua,slua等 库 都抄袭了一个叫做 LuaInterface的库, 而这个异常传递导致崩溃的问题,就是LuaInterface自身 设计的问题

修改起来也很简单,避免将C#层的异常,抛给Lua去处理

直接在C#层打印Log,也可以将当前Lua堆栈打Log,同时向Lua层返回一个 nil即可

ulua,slua,tolua,xlua 等跨语言C#Lua 接口崩溃原因

这个问题本质原因是:

Lua如果使用c编译,使用的longjmp方式处理的异常,c++编译器的话,使用的是c++自己的异常机制;

而C# 是托管代码,走的是Mono虚拟机上的异常处理,

而异常处理,本质上还是要借用 操作系统级别上的 接口

当异常发生的时候,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/

点赞
收藏
评论区
推荐文章
浅梦一笑 浅梦一笑
2个月前
初学 Python 需要安装哪些软件?超级实用,小白必看!
编程这个东西是真的奇妙。对于懂得的人来说,会觉得这个工具是多么的好用、有趣,而对于小白来说,就如同大山一样。其实这个都可以理解,大家都是这样过来的。那么接下来就说一下python相关的东西吧,并说一下我对编程的理解。本人也是小白一名,如有不对的地方,还请各位大神指出01名词解释:如果在编程方面接触的比较少,那么对于软件这一块,有几个名词一定要了解,比如开发环
Jacquelyn38 Jacquelyn38
1年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。 1、使用解构获取json数据let jsonData   id: 1, status: "OK", data: ['a', 'b'] ; let  id, status, data: number   jsonData; console.log(id, status, number )
刚刚好 刚刚好
2个月前
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
晴空闲云 晴空闲云
2个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。 盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
Wesley13 Wesley13
1年前
Java爬虫之JSoup使用教程
title: Java爬虫之JSoup使用教程 date: 2018-12-24 8:00:00 +0800 update: 2018-12-24 8:00:00 +0800 author: me cover: [https://img-blog.csdnimg.cn/20181224144920712](https://www.oschin
Wesley13 Wesley13
1年前
03.Android崩溃Crash库之ExceptionHandler分析
#### 目录总结 * 00.异常处理几个常用api * 01.UncaughtExceptionHandler * 02.Java线程处理异常分析 * 03.Android中线程处理异常分析 * 04.为何使用setDefaultUncaughtExceptionHandler ### 前沿 * 上一篇整体介绍了crash崩溃
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_34035044 helloworld_34035044
4个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为