puerts
puerts copied to clipboard
[UE] Bug: 使用Unreal_v1.0.5 v8_94以后test与shipping启动崩溃
前置阅读 | Pre-reading
Puer的版本 | Puer Version
Unreal_v1.0.5
UE的版本 | UE Version
5.2.1
发生在哪个平台 | Platform
Android
错误信息 | Error Message
原始崩溃日志如下:
[2023.11.10-18.42.41:572][ 0]LogSVGameInstance: USVGameInstance Create JSEnv, Port:8090
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: === Critical error: ===
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error:
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: Fatal error: [File:./Runtime/Core/Private/HAL/MallocBinned2.cpp] [Line: 1438]
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: FMallocBinned2 Attempt to realloc an unrecognized block 0xb400007da75c0000 canary == 0x0 != 0xe3
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: [Callstack] 0x0000007D95A0C37C libUnreal.so(0x0000000005A0437C) []
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: [Callstack] 0x0000007D999C892C libUnreal.so(0x00000000099C092C)
[]
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: [Callstack] 0x0000007D999C7814 libUnreal.so(0x00000000099BF814)
[]
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: [Callstack] 0x0000007D9974FAD4 libUnreal.so(0x0000000009747AD4)
[]
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: [Callstack] 0x0000007D99750364 libUnreal.so(0x0000000009748364)
[]
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: [Callstack] 0x0000007D99BB92E0 libUnreal.so(0x0000000009BB12E0)
[]
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: [Callstack] 0x0000007D99685BFC libUnreal.so(0x000000000967DBFC)
[]
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: [Callstack] 0x0000007D99685D2C libUnreal.so(0x000000000967DD2C)
[]
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: [Callstack] 0x0000007D943A189C libUnreal.so(0x000000000439989C)
[]
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: [Callstack] 0x0000007D9439F94C libUnreal.so(0x000000000439794C)
[]
[2023.11.10-18.42.41:586][ 0]LogAndroid: Error: [Callstack] 0x0000007D9439F7C0 libUnreal.so(0x00000000043977C0)
[]
[2023.11.10-18.42.41:587][ 0]LogAndroid: Error: [Callstack] 0x0000007D9579A658 libUnreal.so(0x0000000005792658)
[]
[2023.11.10-18.42.41:587][ 0]LogAndroid: Error: [Callstack] 0x0000007D9576E058 libUnreal.so(0x0000000005766058)
[]
[2023.11.10-18.42.41:587][ 0]LogAndroid: Error: [Callstack] 0x0000007D9576DB6C libUnreal.so(0x0000000005765B6C)
[]
[2023.11.10-18.42.41:587][ 0]LogAndroid: Error: [Callstack] 0x0000007D984A57EC libUnreal.so(0x000000000849D7EC)
[]
[2023.11.10-18.42.41:587][ 0]LogAndroid: Error: [Callstack] 0x0000007D9398C950 libUnreal.so(0x0000000003984950)
[]
[2023.11.10-18.42.41:587][ 0]LogAndroid: Error: [Callstack] 0x0000007D9398AFEC libUnreal.so(0x0000000003982FEC)
[]
[2023.11.10-18.42.41:587][ 0]LogAndroid: Error: [Callstack] 0x0000007D939981A8 libUnreal.so(0x00000000039901A8)
[]
[2023.11.10-18.42.41:590][ 0]LogAndroid: Error: [Callstack] 0x0000007D939C09A0 libUnreal.so(0x00000000039B89A0)
[]
[2023.11.10-18.42.41:590][ 0]LogAndroid: Error: [Callstack] 0x0000007F107BB1DC libc.so(0x00000000000DF1DC)
[]
[2023.11.10-18.42.41:590][ 0]LogAndroid: Error: [Callstack] 0x0000007F107672F0 libc.so(0x000000000008B2F0)
[]
[2023.11.10-18.42.41:590][ 0]LogAndroid: Error:
[2023.11.10-18.42.41:590][ 0]LogAndroid: Error:
[2023.11.10-18.42.41:590][ 0]LogAndroid: Error:
[2023.11.10-18.42.41:590][ 0]LogAndroid: Error:
====================================================================
堆栈解析后结果如下:
C:\Users\Admin\AppData\Local\Android\Sdk\ndk\25.1.8937393\toolchains\llvm\prebuilt\windows-x86_64\bin>llvm-addr2line.exe -e libUnreal.so -s -f -C 0x0000000005A0437C 0x00000000099C092C 0x00000000099BF814 0x0000000009747AD4 0x0000000009748364 0x0000000009BB12E0 0x000000000967DBFC 0x000000000967DD2C 0x000000000439989C 0x000000000439794C 0x00000000043977C0 0x0000000005792658 0x0000000005766058 0x0000000005765B6C 0x000000000849D7EC 0x0000000003984950 0x0000000003982FEC 0x00000000039901A8 0x00000000039B89A0
FMallocBinned2::FPerThreadFreeBlockLists::Get()
MallocBinned2.h:411
v8::internal::Log::Log(v8::internal::Logger*, std::__ndk1::basic_string<char, std::__ndk1::char_traits
问题重现 | Bug reproduce
VR项目升级到UE5.2.1之后,将puerts插件升级到Unreal_v1.0.5,使用v8-94版本 https://github.com/Tencent/puerts/releases/download/Unreal_v1.0.5/puerts_v8_94.tgz 打包安卓版本安装到meta quest2以后,test与shipping必现启动崩溃,dev版本可以正常运行 换用v8-84版本就不会出现崩溃的问题
看报错像是内存分配不完整重载导致的。 可以通过禁用ue重载new和delete来验证下,如果禁用后不崩了,那就基本上可以断定是这个原因。
确实禁用UE重载new/delete以后不会崩溃了....... 不过为了使用v8-94去禁用UE重载new/delete不划算 或者当前就保持先用v8-84?车神有什么建议吗
在打包要崩溃的平台前,禁用 puerts的debug功能试试,因为我的没有问题,以前遇到这个问题,好像是改的创建JsEnv 处代码,强制用非debug模式创建
首先用v8-84没问题。 如果要用9.4往下看。 我看8.4和9.4的相关逻辑的最大区别就是Log的构造函数的其中一个参数从const char* 改为std::string了。 恰好这里有个最终分析下来string 构造和析构的问题:https://github.com/Tencent/puerts/issues/1274 ,和这issue的分析是十分吻合的:string里头的new 没重载,用系统内存分配器分配了内存,然后临时string参数析构时的delete因为inline声明能被重载,触发了ue的MallocBinned2的检查。 解决办法可以试试那issue里提到的编译保留global symbol。