Open XYDXYD opened 9 months ago
按理说应该同一unity版本各平台应该是一样的,有没可能你ios和其它平台用的unity版本不一样呢?
这个m128指针调用的是m31c吧?还没直接调用b_os呢。 m31c是怎样的?
版本是这个。
m31c
![]()
版本是这个。
第一个问题说的是“怀疑版本不一样”,你单独发ios的版本没什么意义吧?
很奇怪很多any。。
都是2021.2.6f1 不会有问题的。。 正规团队
m31c
你们pc或者android的这个地方是怎样的?
会不会silicon都会这样。。。
第二个函数不同
我们没有x86的mac,或许跟打包机有关? 另外会不会和优化size/优化speed 有关,我们测不了优化speed,代码大小超了
你试试pc或者android相同选项? 如果相同选项还是不一样,那我怀疑确实是版本不同的。也可能你那显示的版本号不是真实的版本号,unity偷懒用某个已经支持silicon的ios实现合入导致的版本不一致。
我先试试安卓的优化size吧。。 另外bridge我也是在mac打包机上生成的,库也是在打包机编的,这样也对不上么。。
我先试试安卓的优化size吧。。 另外bridge我也是在mac打包机上生成的,库也是在打包机编的,这样也对不上么。。
什么结果?
我先试试安卓的优化size吧。。 另外bridge我也是在mac打包机上生成的,库也是在打包机编的,这样也对不上么。。
这是某种情况下,内部实现的变更,xil2cpp版本强依赖于il2cpp的实现,需要针对性的调整。
被我猜对了,安卓开了优化size也挂。。。
// TResult System.Func`2<System.String,Puerts.JSObject>::Invoke(T)
inline JSObject_t9F72B0C20790A8C540143833E7A57A90D6757D6F* Func_2_Invoke_m128F3F4C9D81AD4CE8E14C527B891B6E42F4A660_inline (Func_2_t27B800349A409E944F0C8BE03B94B94A3EA5300C* __this, String_t* ___arg0, const RuntimeMethod* method)
{
JSObject_t9F72B0C20790A8C540143833E7A57A90D6757D6F* il2cppRetVal;
(( void (*) (Func_2_t7F5F5324CE2DDB7001B68FFE29A5D9F907139FB0*, /*Unity.IL2CPP.Metadata.__Il2CppFullySharedGenericType*/Il2CppFullySharedGenericAny, Il2CppFullySharedGenericAny*, const RuntimeMethod*))Func_2_Invoke_m31CAC166FDC80DC5AE52A5AEFFEE2D9B27A1CA3F_gshared_inline)((Func_2_t7F5F5324CE2DDB7001B68FFE29A5D9F907139FB0*)__this, (Il2CppFullySharedGenericAny)___arg0, (Il2CppFullySharedGenericAny*)&il2cppRetVal, method);
return il2cppRetVal;
}
栈
那就是开启优化size选项后,il2cpp的生成是不一样的。 如果editor那能判断到有没开启这个选项,然后传参给生成代码那,生成代码多加个参数就可以了。
你们的临时解决也简单,所有平台都开启size优化,然后修改这里: https://github.com/Tencent/puerts/blob/master/unity/Assets/core/upm/Editor/Resources/puerts/templates/cppwrapper.tpl.mjs#L444 在method前加个指针参数(void*就可以了)
好的。谢谢
你们的临时解决也简单,所有平台都开启size优化,然后修改这里: https://github.com/Tencent/puerts/blob/master/unity/Assets/core/upm/Editor/Resources/puerts/templates/cppwrapper.tpl.mjs#L444 在method前加个指针参数(void*就可以了)
可能不是添加void*就可以了,我看了下生成的代码,它是用那个做返回值了,我这重现了,我看看怎么处理吧。
应该是做这样的调整,如果一个bridge函数有参数的话,就在method参数前添加一个同类型的指针参数,把return语句改为对该指针指向的内容的修改。 比如
static void* b_os(void* target, void* p0, void* method) {
// ...
void* ret = JsValueToCSRef(context, MaybeRet.ToLocalChecked(), TIret);
return ret;
}
改为
static void b_os(void* target, void* p0, void** pret, void* method) {
// ...
void* ret = JsValueToCSRef(context, MaybeRet.ToLocalChecked(), TIret);
*pret = ret;
}
指针改为指针的指针 int改为int的指针 依此类推
修改好了,我试了不会崩溃,我搞了个分支,你按这个修改:https://github.com/Tencent/puerts/commit/63d96e9b4c7b0d3144c09f428780c4a90d69ecee
修改好了,我试了不会崩溃,我搞了个分支,你按这个修改:63d96e9
按这个修改试了吗? @XYDXYD
前几天请假了, 刚试了一下, 不会一启动就crash了。
前几天请假了, 刚试了一下, 不会一启动就crash了。
那你整个游戏跑跑看有没什么其它问题。 没问题我通过宏合入到master
还有一些其他的crash,最近可能没什么时间接这个了,只能业余时间看看
前置阅读 | Pre-reading
Puer的版本 | Puer Version
2.0.3
Unity的版本 | Unity Version
2021.2.6f1
发生在哪个平台 | Platform
iOS
错误信息 | Error Message
栈大概这样:![L{M_A336`TI7WD%B60ZYJ7Y](https://github.com/Tencent/puerts/assets/3821932/9f07a993-f93d-4052-a76c-c281910a9412)
Func_2_Invoke 调用 bridge中的b_os函数时,参数数量对不上。 ilcpp代码传过去了4个参数,executor,arg,retval,method。
但b_os接收的参数不包含中间的retval。
导致method指针指向了错误的内存。GetReturnType时crash
注: PC和安卓的Func_2_Invoke是往下传3个参数的,但是ios不同,不清楚为什么。 打包机是arm架构的mac
问题重现 | Bug reproduce
正常流程跑xil2cpp的打包。 启动即crash。