真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android中怎么利用JNI和Crash實(shí)現(xiàn)定位

本篇文章為大家展示了Android中怎么利用JNI和Crash實(shí)現(xiàn)定位,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供瑪多網(wǎng)站建設(shè)、瑪多做網(wǎng)站、瑪多網(wǎng)站設(shè)計(jì)、瑪多網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、瑪多企業(yè)網(wǎng)站模板建站服務(wù),10年瑪多做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

1. 巧婦內(nèi)為無米之炊,找到未strip的, 符號表完整的so庫文件

在Android Studio 3.2.1: 

strip之前的文件所在目錄:

app/build/intermediaters/transforms/mergejniLibs/debug

或者根據(jù)Crash的APP是debug還是release版本選擇

app/build/intermediates/cmake/debug/obj或app/build/intermediates/cmake/release/obj

如果依賴的是Native module或者aar, 那么

strip之前的文件所在目錄:

yourNativeLibModule/build/intermediates/transforms/mergeJniLibs/debug

由于CMake/CXX_FLAGS的配置等原因,以上目錄下的文件可能還是被strip了。如何準(zhǔn)確判斷so有沒有被strip請參照文章下面提到的readelf工具。

如果發(fā)現(xiàn)so被strip,嘗試在CMake添加如下配置:

# 這幾行代碼表示debug版本的so文件保留so保留符號庫,這樣會導(dǎo)致so文件很大,# 如果要讓release版本保留符號庫文件,就替換成CMAKE_C_FLAGS_RELEASE和CMAKE_CXX_FLAGS_RELEASE# 但務(wù)必在正式對外發(fā)布的時(shí)候去掉release 配置的-g選項(xiàng),以免增加文件sizeset(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")# R16之前版本的NDK默認(rèn)是編譯時(shí)加-g的,新版本不確定,所以需要不strip的 so文件,最好在CMake里配置一下-g

strip之后的文件所在目錄:

app/build/intermediaters/transforms/stripDebugSymbol/debug

2. 打蛇要打七寸,確定發(fā)生Crash的設(shè)備對應(yīng)的CPU架構(gòu)

在JNI Crash的日志里

如果有l(wèi)ib/arm, 則是armeabi-v7a架構(gòu); 

如果有l(wèi)ib/arm64, 則是arm64-v8a架構(gòu)

然后根據(jù)CPU架構(gòu)找相應(yīng)的toolchain:

arm64-v8a對應(yīng)的是aarch74-linux-android-4.9

armeabi-v7a對應(yīng)的是arm-linux-androideabi-4.9

4. 工欲善其事必先利其器,使用add2line 和ndk-stack等工具分析JNI Crash的log

addr2line

作用是根據(jù)內(nèi)存地址找到對應(yīng)的報(bào)錯(cuò)代碼的文件名和行號

所在目錄是toolchain的bin文件夾,

比如 aarch74-linux-android-4.9對應(yīng)的bin文件夾是

/Android/Sdk/ndk-bundle/toolchains/aarch74-linux-android-4.9/prebuilt/linux-x86_64/bin

arm-linux-androideabi-4.9,對應(yīng)的bin文件夾是

/media/kyle/a393d005-ebe5-42a0-8c6a-c86fdfb185c1/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin

用法:

# -f表示顯示函數(shù)名, -e表示execution,后面是包含符號庫的文件 以及報(bào)錯(cuò)的內(nèi)存地址(即Crash log里pc后的字段)arm-linux-androideabi-addr2line -f -e xxx.so 0x8eb09258

ndk-stack

作用是一鍵生成更可讀的Crash 日志

所在目錄是

/media/kyle/a393d005-ebe5-42a0-8c6a-c86fdfb185c1/Android/Sdk/ndk-bundle/ndk-stack

用法:

# -sym表示symbolsndk-stack -sym App/build/intermediates/transforms/mergeJniLibs/release/0/lib/對應(yīng)的abi目錄 -dump jniCrash.log

或者

adb logcat | ndk-stack -sym  App/build/intermediates/transforms/mergeJniLibs/release/0/lib/對應(yīng)的abi目錄

------------------------分隔符------------------------

其他工具補(bǔ)充

toolchain下的:

arm-linux-androideabi-readelf

1. 有時(shí)候用addr2line發(fā)現(xiàn)能顯示函數(shù)名但行號是亂碼??,有可能是因?yàn)檫@個(gè)so被strip了。被strip的so的

readelf結(jié)果里“section headers”的個(gè)數(shù)會比未strip后的少,所以可以根據(jù)readelf來判斷so是否是真的被strip了

命令格式:

arm-linux-androideabi-readelf -S xx.so

2. 可以用于查看so文件中的所有函數(shù)。所以如果遇到JNI方法找不到的錯(cuò)誤,就可以使用該工具查看so庫中的所有函數(shù),然后搜索對應(yīng)的JNI方法,看到底有沒有被編譯到動態(tài)庫中。

命令格式:

arm-linux-androideabi-readelf -a xx.so > fun.txt # 注意:仍需要使用未strip之前的so文件, 上面的命令會把結(jié)果寫入fun.txt

arm-linux-androideabi-objdump

可以獲取so文件的符號表信息,可以看到編譯進(jìn)來的所有方法以及調(diào)用堆棧的地址.

命令格式:

arm-linux-androideabi-objdump -dx xx.so > stacktrace.txt 或aarch74-linux-android-objdump -dx xx.so > stacktrace.txt

arm-linux-androideabi-nm

可以查看靜態(tài)庫中的符號,比如查看所有方法的聲明。

如果在用靜態(tài)庫編譯so動態(tài)庫的過程中碰到undefined reference類型的錯(cuò)誤, 或者

duplicated reference, 可以使用這條指令將對應(yīng)靜態(tài)庫的所有方法都導(dǎo)出來, 然后看一下是否有某方法

命令格式:

arm-linux-androideabi-nm xx.a > symbol.txt

常用信號量的含義:

#define SIGABRT 6 // abort() 調(diào)用abort函數(shù)生成的信號,表示程序運(yùn)行異常被中止#define SIGSEGV 11 // segmentation violation 指針?biāo)鶎?yīng)的地址是無效或非法地址,比如訪問越界/stack overflow/文件操作不被允許( fault addr 0x0一般是空指針錯(cuò)誤)#define SIGILL 4 // Illegal instruction 執(zhí)行了非法指令,比如第三方庫的兼容性問題,權(quán)限問題#define SIGSYS 31 // bad argument to system call 非法的系統(tǒng)調(diào)用#define SIGBUS 7 // 非法地址,包括內(nèi)存地址對齊出錯(cuò),比如訪問一個(gè)4字節(jié)的整數(shù), 但其地址不是4的倍數(shù)#define SIGFPE 8 // 進(jìn)程執(zhí)行了一個(gè)錯(cuò)誤的算術(shù)操作,比如除0、溢出#define SIGKILL 9 // 強(qiáng)制結(jié)束程序,本信號不能被捕獲#define SIGPIPE 13 // write on a pipe with no one to read it 管道破裂,通常在進(jìn)程間通信產(chǎn)生

上述內(nèi)容就是Android中怎么利用JNI和Crash實(shí)現(xiàn)定位,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁標(biāo)題:Android中怎么利用JNI和Crash實(shí)現(xiàn)定位
鏈接地址:http://weahome.cn/article/gepsco.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部