2017-09-27 12 views
0

Cmakeを使用してアプリケーションにネイティブコードをコンパイルするAndroidアプリケーションがあり、Android 7.1を実行しているPixelデバイスでうまく機能していました。 PixelデバイスをOreo 8.0にアップグレードすることにしましたが、今ではアプリケーションにネイティブC++コードを入力できません。Android Oreo 8.0ネイティブC++クラッシュ:無効なpthread_tがlibcに渡されました

これは、それがクラッシュしたときに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) 

は、共有ライブラリ

add_library(NativeLib SHARED IMPORTED) 
set_property(TARGET NativeLib PROPERTY IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/NativeLib/Android/Release/${ANDROID_ABI}/libNativeLib.so") 

共有ライブラリがターゲットにリンクされます追加cmakeのコードです。

私が言ったように、これはAndroid 7.1上で完璧に動作していて、デバイスを8.0にアップグレードするとこのクラッシュが発生しました。これは新しいバグですか?私はここで8.0の "ネイティブライブラリ"の変更を読んだ。https://developer.android.com/about/versions/oreo/android-8.0-changes.html

私はまた、8.0のために大丈夫に見えた、私のライブラリにreadelfが走り、その背中を得た:

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 

任意のアイデア?ありがとう!

答えて

1

問題があります__pthread_internal_find関数です。

Android 8.0以前では、スレッドリストにスレッドが見つからない場合は、nullptrが返されます。しかし、Android 8.0では、致命的な問題が発生します。

これがとにかくPOSIXのもののより慎重な取り扱いを必要とされて...

は、参考のためにpthread_internal.cppの最後のコードブロックを参照してください。

+0

返信いただきありがとうございます!それが問題の原因となっているように見えます。 – mekostelecky

関連する問題