cocos2d-x 3.17.1 在android 64位手机崩溃

使用ndk-build打支持64位的包,但是在64位设备上运行会随机崩溃signal 11 (SIGSEGV),而且报错都是anonymous和unknown。
各种版本号:cocos2d-x 3.17.1, ndk 16, Android Studio 3.4.1, gradle tools 3.2.0, gradle wrapper 4.6.
在网上看其他帖子,通过ndk-stack能定位到出错的代码,但是我这里遇到的情况是anonymous和unknown,求助。

以下是Logcat的报错:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Xiaomi/chiron/chiron:8.0.0/OPR1.170623.027/V10.3.1.0.ODECNXM:user/release-keys'
Revision: '0'
ABI: 'arm64'
pid: 17667, tid: 17711, name: GLThread 135726  >>> com.test.myapp <<<
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x72adf0f460
     x0   00000072bc089378  x1   0000000000000000  x2   fffd8072bc08bc18  x3   fffd8072bb3f4950
     x4   00000000ee1763de  x5   fffd8072bc096c88  x6   ff687373604f6d64  x7   7f7f7f7f7f7f7f7f
     x8   00000072b09a9f08  x9   00000072b09a9f00  x10  fffffffffffffffb  x11  00000072a9bcc6c8
     x12  00000072aceade40  x13  0000000000000000  x14  0000000000697474  x15  00000072a9ac6c10
     x16  0000000000000001  x17  fffa0072a9ac58c8  x18  0000000000000012  x19  00000072b09a9e98
     x20  fffd8072a9bc31e0  x21  00000072a9bcfa00  x22  00000072bc0893d8  x23  00000072ac48ab40
     x24  00000072b162cca8  x25  00000072ade90978  x26  00000072a94d0c20  x27  00000072a99953e0
     x28  00000072a9995070  x29  00000072b0da8080  x30  fffd8072a9ac48a0
     sp   00000072b0da8060  pc   00000072adf0f460  pstate 0000000080000000
 backtrace:
     #00 pc 0000000000078460  <anonymous:00000072ade97000>
     #01 pc fffd8072a9ac489c  <unknown>

以下是ndk-stack生成的:

********** Crash dump: **********
Build fingerprint: 'Xiaomi/chiron/chiron:8.0.0/OPR1.170623.027/V10.3.1.0.ODECNXM:user/release-keys'
pid: 17667, tid: 17711, name: GLThread 135726  >>> com.test.myapp <<<
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x72adf0f460
Stack frame #00 pc 0000000000078460  <anonymous:00000072ade97000>
Stack frame #01 pc fffd8072a9ac489c  <unknown>

打的包是调试版的么

是的。不管debug还是release都崩溃。只打armv7架构就不会崩。

我这想升级版本也遇到了同样的问题,3.17.1和3.17.2都有这个问题。在3.16没问题,3.17之后的版本启动游戏然后强制杀掉游戏,再进游戏调用cc.FileUtils:getInstance():getStringFromFile这个就崩溃,而且没有traces的log

推荐你3.16,不崩溃

@wanghphy 是用什么语言编写的?
@1055768118 具体怎么操作?

说说我的情况吧
使用的是lua开发,
项目使用的是3.17版本,但是 luajit 在android中release模式不稳定,随机崩溃,好像我看有人说luajit使用gcc编译链接,目前cocos 生成的项目是使用clang编译导致不兼容,ok,我把3.17.2中的luajit目录替换,修改const luaL_reg global_functions [] = { 为const luaL_Reg global_functions [] = {,然后打包,发现32位也就是armv7a的确不出现随机崩溃,但是64位崩溃概率非常大,到达上85%左右,当前准备使用32位luajit和64位luajit混合使用。32位用新版,64位用旧版。

可以用 luajit 最新的代码试一下,luajit 一直停留在 beta3,之后有新的 commit,但是都没有发布版本。

我用了早期版本的luajit还是崩溃
现在全盘滚回3.16就一切正常了

如果是只是替换 3.16 版本的 luajit 呢?有试过吗?

也可以这里下载最新的 luajit 试试:https://github.com/PatriceJiang/cocos2d-x-3rd-party-libs-bin/tree/v3-latest-luajit/lua/luajit/prebuilt/android。

刚才找了昨天两台必闪手机(arm64-v8a架构)测试,发现不闪退了。官方给力:2:。使用了最新版https://github.com/PatriceJiang/cocos2d-x-3rd-party-libs-bin/tree/v3-latest-luajit/lua/luajit/prebuilt/android。

好消息,谢谢你的反馈。

替换luajit后,64位下的崩溃问题没有出现了,但经过luacompile的lua代码无法正常运行。尝试使用https://github.com/LuaJIT/LuaJIT/pull/359重新编译luajit工具貌似不能解决。

请问找到其他的加密方式了吗?这个是因为64和32位导致的。

–disable-compile不编译成字节码就可以了。

luajit 字节码是区分32和64位的,luac或者lua加密成其他格式的并不是字节码,你可以使用引擎下面的32bit/luajit-win32.exe 64bit/luajit-win32.exe工具生成对应平台的字节码。官方应该也提供了加密脚本吧

ldump.c 生成bytecode。static void DumpString(const TString* s, DumpState* D) 中 size_t 换成 int
lundump.c 加载解析bytecode static TString* LoadString(LoadState* S) 中 size_t 换成 init
luac 文件头部数据 void luaU_header (char* h) 中 size_t 换成 int
替换minggo帖子里最新的luajit,3.17.2,替换上面三个位置的size_t,helloworid加密在三星s9测试可以正常跑起来。

我之前一直没使用过luajit,在cocos2d-x 3.x中怎么开启luajit? 另外我一直没有将lua编译为字节码,直接加密 --disable-compile不编译成字节码,这种情况下是不是luajit即使开启了也无法工作?luajit开启有哪些步骤?不编译成字节码就一定是用不了luajit?或者说怎么确认luajit已经在使用?谢谢!

之前用的3.17折腾了两个项目,崩溃率一直在15%+,最近这个项目受不了,又升级了3.17.2降低到了10%以下,各种升级Luajit,一样还有很多unkown,位置的