Tencent / puerts

PUER(普洱) Typescript. Let's write your game in UE or Unity with TypeScript.
Other
4.96k stars 695 forks source link

[Unity] Bug: xil2cpp IOS版在启动时调用ExecuteModule时crash #1600

Open XYDXYD opened 9 months ago

XYDXYD commented 9 months ago

前置阅读 | Pre-reading

Puer的版本 | Puer Version

2.0.3

Unity的版本 | Unity Version

2021.2.6f1

发生在哪个平台 | Platform

iOS

错误信息 | Error Message

栈大概这样: L{M_A336`TI7WD%B60ZYJ7Y

Func_2_Invoke 调用 bridge中的b_os函数时,参数数量对不上。 ilcpp代码传过去了4个参数,executor,arg,retval,method。 EZN38$F@Q4`}J@Z_PNTHCO0 但b_os接收的参数不包含中间的retval。

image

导致method指针指向了错误的内存。GetReturnType时crash

注: PC和安卓的Func_2_Invoke是往下传3个参数的,但是ios不同,不清楚为什么。 打包机是arm架构的mac

问题重现 | Bug reproduce

正常流程跑xil2cpp的打包。 启动即crash。

chexiongsheng commented 9 months ago

按理说应该同一unity版本各平台应该是一样的,有没可能你ios和其它平台用的unity版本不一样呢?

chexiongsheng commented 9 months ago

这个m128指针调用的是m31c吧?还没直接调用b_os呢。 m31c是怎样的?

XYDXYD commented 9 months ago
image

版本是这个。

XYDXYD commented 9 months ago

C)_~C_`1IRCG7Q8TO%ZN($0 m31c

chexiongsheng commented 9 months ago
image

版本是这个。

第一个问题说的是“怀疑版本不一样”,你单独发ios的版本没什么意义吧?

XYDXYD commented 9 months ago

很奇怪很多any。。

XYDXYD commented 9 months ago

都是2021.2.6f1 不会有问题的。。 正规团队

chexiongsheng commented 9 months ago

C)~C`1IRCG7Q8TO%ZN($0 m31c

你们pc或者android的这个地方是怎样的?

XYDXYD commented 9 months ago

会不会silicon都会这样。。。

XYDXYD commented 9 months ago
image image

第二个函数不同

XYDXYD commented 9 months ago

我们没有x86的mac,或许跟打包机有关? 另外会不会和优化size/优化speed 有关,我们测不了优化speed,代码大小超了

chexiongsheng commented 9 months ago

你试试pc或者android相同选项? 如果相同选项还是不一样,那我怀疑确实是版本不同的。也可能你那显示的版本号不是真实的版本号,unity偷懒用某个已经支持silicon的ios实现合入导致的版本不一致。

XYDXYD commented 9 months ago

我先试试安卓的优化size吧。。 另外bridge我也是在mac打包机上生成的,库也是在打包机编的,这样也对不上么。。

chexiongsheng commented 9 months ago

我先试试安卓的优化size吧。。 另外bridge我也是在mac打包机上生成的,库也是在打包机编的,这样也对不上么。。

什么结果?

chexiongsheng commented 9 months ago

我先试试安卓的优化size吧。。 另外bridge我也是在mac打包机上生成的,库也是在打包机编的,这样也对不上么。。

这是某种情况下,内部实现的变更,xil2cpp版本强依赖于il2cpp的实现,需要针对性的调整。

XYDXYD commented 9 months ago

被我猜对了,安卓开了优化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;
}
XYDXYD commented 9 months ago

image
chexiongsheng commented 9 months ago

那就是开启优化size选项后,il2cpp的生成是不一样的。 如果editor那能判断到有没开启这个选项,然后传参给生成代码那,生成代码多加个参数就可以了。

chexiongsheng commented 9 months ago

你们的临时解决也简单,所有平台都开启size优化,然后修改这里: https://github.com/Tencent/puerts/blob/master/unity/Assets/core/upm/Editor/Resources/puerts/templates/cppwrapper.tpl.mjs#L444 在method前加个指针参数(void*就可以了)

XYDXYD commented 9 months ago

好的。谢谢

chexiongsheng commented 9 months ago

你们的临时解决也简单,所有平台都开启size优化,然后修改这里: https://github.com/Tencent/puerts/blob/master/unity/Assets/core/upm/Editor/Resources/puerts/templates/cppwrapper.tpl.mjs#L444 在method前加个指针参数(void*就可以了)

可能不是添加void*就可以了,我看了下生成的代码,它是用那个做返回值了,我这重现了,我看看怎么处理吧。

chexiongsheng commented 9 months ago

应该是做这样的调整,如果一个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的指针 依此类推

chexiongsheng commented 9 months ago

修改好了,我试了不会崩溃,我搞了个分支,你按这个修改:https://github.com/Tencent/puerts/commit/63d96e9b4c7b0d3144c09f428780c4a90d69ecee

chexiongsheng commented 9 months ago

修改好了,我试了不会崩溃,我搞了个分支,你按这个修改:63d96e9

按这个修改试了吗? @XYDXYD

XYDXYD commented 9 months ago

前几天请假了, 刚试了一下, 不会一启动就crash了。

chexiongsheng commented 9 months ago

前几天请假了, 刚试了一下, 不会一启动就crash了。

那你整个游戏跑跑看有没什么其它问题。 没问题我通过宏合入到master

XYDXYD commented 9 months ago

还有一些其他的crash,最近可能没什么时间接这个了,只能业余时间看看