Android Oreo 8.0原生C++崩溃:无效的pthread_t传递给libc

3

我有一个使用Cmake将本地代码编译到我的Android应用程序中的应用程序,在运行Android 7.1的Pixel设备上运行得很好。我决定将Pixel设备升级到Oreo 8.0,现在我无法进入我的应用程序中的本地C++代码。

这是它崩溃时的logcat转储:

A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
A/DEBUG: Build fingerprint: 'google/sailfish/sailfish:8.0.0/OPR3.170623.007/4286350:user/release-keys'
A/DEBUG: Revision: '0'
A/DEBUG: ABI: 'arm64'
A/DEBUG: pid: 29454, tid: 30950, name: Thread-24  >>> com.myapp.nativecppapp <<<
A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
A/DEBUG: Abort message: 'invalid pthread_t 0x727d3004f0 passed to libc'
A/DEBUG:     x0   0000000000000000  x1   00000000000078e6  x2   0000000000000006  x3   0000000000000008
A/DEBUG:     x4   0000000000000000  x5   0000000000000000  x6   0000000000000000  x7   0000000000000030
A/DEBUG:     x8   0000000000000083  x9   222b2e8c5b032e6a  x10  0000000000000000  x11  0000000000000001
A/DEBUG:     x12  ffffffffffffffff  x13  0000000000000001  x14  0000000000000000  x15  000849a75d18b53a
A/DEBUG:     x16  00000072a8aee2f8  x17  00000072a8a905d0  x18  00000072a70fef30  x19  000000000000730e
A/DEBUG:     x20  00000000000078e6  x21  0000007286081ac0  x22  000000728609b998  x23  0000007286081a88
A/DEBUG:     x24  0000007286081ac4  x25  000000727d3fcee0  x26  000000727d3fceb8  x27  00000000000001cc
A/DEBUG:     x28  000000727fe6b000  x29  000000727d3fcc20  x30  00000072a8a44994
A/DEBUG:     sp   000000727d3fcbe0  pc   00000072a8a905d8  pstate 0000000060000000
A/DEBUG: backtrace:
A/DEBUG:     #00 pc 00000000000695d8  /system/lib64/libc.so (tgkill+8)
A/DEBUG:     #01 pc 000000000001d990  /system/lib64/libc.so (abort+88)
A/DEBUG:     #02 pc 000000000002516c  /system/lib64/libc.so (__libc_fatal+116)
A/DEBUG:     #03 pc 0000000000066470  /system/lib64/libc.so (_Z23__pthread_internal_findl+164)
A/DEBUG:     #04 pc 0000000000065fa8  /system/lib64/libc.so (pthread_detach+16)
A/DEBUG:     #05 pc 0000000000043528  /data/app/com.myapp.nativecppapp-SwBY2G1qycu-8Vec8QIe8w==/lib/arm64/libNativeLib.so
A/DEBUG:     #06 pc 000000000002a6e4  /data/app/com.myapp.nativecppapp-SwBY2G1qycu-8Vec8QIe8w==/lib/arm64/libNativeLib.so
A/DEBUG:     #07 pc 0000000000052430  /data/app/com.myapp.nativecppapp-SwBY2G1qycu-8Vec8QIe8w==/lib/arm64/libNativeLib.so
A/DEBUG:     #08 pc 000000000005176c  /data/app/com.myapp.nativecppapp-SwBY2G1qycu-8Vec8QIe8w==/lib/arm64/libNativeLib.so
A/DEBUG:     #09 pc 000000000004339c  /data/app/com.myapp.nativecppapp-SwBY2G1qycu-8Vec8QIe8w==/lib/arm64/libNativeLib.so
A/DEBUG:     #10 pc 0000000000065f88  /system/lib64/libc.so (_ZL15__pthread_startPv+36)
A/DEBUG:     #11 pc 000000000001ed24  /system/lib64/libc.so (__start_thread+68)

这里是添加共享库的Cmake代码。
add_library(NativeLib SHARED IMPORTED)
set_property(TARGET NativeLib PROPERTY IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/NativeLib/Android/Release/${ANDROID_ABI}/libNativeLib.so")

共享库随后被链接到目标。就像我所说的,在Android 7.1上所有都可以完美运行,将设备升级到8.0导致了这个崩溃,这是一个新的bug吗?我在这里阅读了“Native Libraries”关于8.0的变化: https://developer.android.com/about/versions/oreo/android-8.0-changes.html
我还在我的库上运行了readelf,并得到了这个结果,对于8.0来说看起来还可以:
LOAD           0x000000 0x0000000000000000 0x0000000000000000 0x1b61c8 0x1b61c8 R E 0x10000
LOAD           0x1b6750 0x00000000001c6750 0x00000000001c6750 0x015fc0 0x085260 RW  0x10000
DYNAMIC        0x1c1010 0x00000000001d1010 0x00000000001d1010 0x0002c0 0x0002c0 RW  0x8
GNU_EH_FRAME   0x1871a0 0x00000000001871a0 0x00000000001871a0 0x006bac 0x006bac R   0x4
GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10
GNU_RELRO      0x1b6750 0x00000000001c6750 0x00000000001c6750 0x00b8b0 0x00b8b0 R   0x1

有什么想法吗?谢谢!

尝试连接套接字时遇到这个问题...有没有什么解决方法? - GetSwifty
1个回答

2
问题出现在 __pthread_internal_find 函数中。
在 Android 8.0 之前,如果线程列表中找不到任何线程,则只会返回 nullptr。然而,在 Android 8.0 中,会产生致命错误。
这需要更加谨慎地处理 POSIX 相关的内容...
请参考 pthread_internal.cpp 最后的代码块。

谢谢回复!看起来那就是问题所在。 - mekostelecky
1
@mekostelecky,你有解决这个问题的方法/变通方法吗? - GetSwifty
如何知道哪个函数引起了问题,以及在哪里进行修复。 - sneharc
更多细节请参阅Bionic文档中以下链接:https://gerrit.pixelexperience.org/plugins/gitiles/bionic/+/HEAD/docs/status.md#invalid-handling-targetsdkversion-o - vhamon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接