Tencent / UnLua

A feature-rich, easy-learning and highly optimized Lua scripting plugin for UE.
Other
2.28k stars 619 forks source link

偶现C++侧delegate Broadcast容器到Lua元素类型错误 #593

Open jozhn opened 1 year ago

jozhn commented 1 year ago

类似 https://github.com/Tencent/UnLua/issues/265

参数类型是const TArray<FXXX>&,偶现TArray传到Lua后里面元素类型是另外的结构体。

特定情况下会必现,广播前将ScriptContainerMap清空就不会出现:

debug.getregistry()["ScriptContainerMap"] = {}

所以跟ScriptContainerMap内缓存的userdata有关

aleverys commented 1 year ago

这个ScriptContainerMap缓存key是一个lightuserdata指针 也就是TArray的内存地址 我猜会不会是这个array的内存被释放又重新分配 导致地址正好重叠了?

ctscts2008 commented 1 year ago

遇到了同样得问题,minidump里看到了luaarray的inner类型不对,和其他的对换了,麻烦问下有什么稳定复现的方式吗

jozhn commented 1 year ago

这个ScriptContainerMap缓存key是一个lightuserdata指针 也就是TArray的内存地址 我猜会不会是这个array的内存被释放又重新分配 导致地址正好重叠了?

是的,目前只能通过将UnLua参数使用拷贝来规避。

aleverys commented 1 year ago

这个问题不大 地址重叠就重叠 主要是对应的FLuaArray的Ele的Type改了 只要在LuaCore.cpp的CacheScriptContainer函数里面 判断Ele的Type是否变化就行 LuaArray/Set/Map都有TypeInterface类型的变量来代表类型信息 如果是反射创建的就判定一下Property,如果Property为空就是静态导出 就判定一下Name 变化了就重新创建一下userdata 不走缓存了

jozhn commented 1 year ago

这个问题不大 地址重叠就重叠 主要是对应的FLuaArray的Ele的Type改了 只要在LuaCore.cpp的CacheScriptContainer函数里面 判断Ele的Type是否变化就行 LuaArray/Set/Map都有TypeInterface类型的变量来代表类型信息 如果是反射创建的就判定一下Property,如果Property为空就是静态导出 就判定一下Name 变化了就重新创建一下userdata 不走缓存了

能给一下修改代码参考么