NDK開發錯誤定位

在NDK開發過程中,會經常遇到報錯,但是這個不同於其他會把錯誤明顯列印在日誌上,這個只是把錯誤碼會列印在日誌,但如何定位錯誤出現在哪裡呢,請讓我慢慢道來!
NDK錯誤定位流程
第一種方法:
-
開啟cmd視窗
-
切換到ndk工具arm-linux-androideabi-addr2line目錄
cd D:\android\android-ndk-r7b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\bin d:
-
在Logcat把錯誤複製出來
09-20 16:29:13.416: A/DEBUG(16497): Build fingerprint: 'OPPO/A57/A57:6.0.1/MMB29M/1499840266:user/release-keys' 09-20 16:29:13.416: A/DEBUG(16497): Revision: '0' 09-20 16:29:13.416: A/DEBUG(16497): ABI: 'arm' 09-20 16:29:13.417: A/DEBUG(16497): pid: 18166, tid: 18191, name: .dnffmpegplayer>>> com.dongnaoedu.dnffmpegplayer <<< 09-20 16:29:13.417: A/DEBUG(16497): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x6c646ea1 09-20 16:29:13.443: A/DEBUG(16497):r0 dbc407f8r1 eef3b9f0r2 dbc408d4r3 eef3b9f0 09-20 16:29:13.444: A/DEBUG(16497):r4 e5ebb800r5 dbc40970r6 6c646e61r7 dbc407f8 09-20 16:29:13.444: A/DEBUG(16497):r8 dbc408d4r9 eef3b9f0sl dbb42000fp f36411d5 09-20 16:29:13.444: A/DEBUG(16497):ip f3643eb8sp dbc407d8lr f3641295pc dd9b37c4cpsr 800f0010 09-20 16:29:13.446: A/DEBUG(16497): backtrace: 09-20 16:29:13.446: A/DEBUG(16497):#00 pc 005af7c4/data/app/com.dongnaoedu.dnffmpegplayer-2/lib/arm/libavcodec-56.so (avcodec_decode_video2+36) 09-20 16:29:13.446: A/DEBUG(16497):#01 pc **00002291**/data/app/com.dongnaoedu.dnffmpegplayer-2/lib/arm/libmyffmpeg.so (init_avcodec_decode_video2
-
找到錯誤碼
在上面複製出來的日誌裡找到錯誤碼(00002291)
09-20 16:29:13.446: A/DEBUG(16497):#01 pc **00002291**/data/app/com.dongnaoedu.dnffmpegplayer-2/lib/arm/libmyffmpeg.so
-
找到專案.so檔案目錄
E:/workspace1.0/jni/dn_ffmpeg_player/obj/local/armeabi/libmyffmpeg.so
-
在cmd視窗輸入命令:
arm-linux-androideabi-addr2line -e +.so檔案目錄 +錯誤碼
arm-linux-androideabi-addr2line -e E:/workspace1.0/jni/dn_ffmpeg_player/obj/local/armeabi/libmyffmpeg.so 00002291
-
在cmd視窗可以定位到錯誤的行號
E:\workspace1.0\jni\dn_ffmpeg_player/jni/dn_player.c:68
-
迴歸程式碼找到錯誤並更改
從上面可以得出現錯誤的行號 68,找到錯誤並更改
第二種方法:
-
開啟cmd視窗
-
切換到ndk工具android-ndk-r7b目錄
D:\android\android-ndk-r7b
-
在Logcat把錯誤複製出來
09-20 16:29:13.416: A/DEBUG(16497): Build fingerprint: 'OPPO/A57/A57:6.0.1/MMB29M/1499840266:user/release-keys' 09-20 16:29:13.416: A/DEBUG(16497): Revision: '0' 09-20 16:29:13.416: A/DEBUG(16497): ABI: 'arm' 09-20 16:29:13.417: A/DEBUG(16497): pid: 18166, tid: 18191, name: .dnffmpegplayer>>> com.dongnaoedu.dnffmpegplayer <<< 09-20 16:29:13.417: A/DEBUG(16497): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x6c646ea1 09-20 16:29:13.443: A/DEBUG(16497):r0 dbc407f8r1 eef3b9f0r2 dbc408d4r3 eef3b9f0 09-20 16:29:13.444: A/DEBUG(16497):r4 e5ebb800r5 dbc40970r6 6c646e61r7 dbc407f8 09-20 16:29:13.444: A/DEBUG(16497):r8 dbc408d4r9 eef3b9f0sl dbb42000fp f36411d5 09-20 16:29:13.444: A/DEBUG(16497):ip f3643eb8sp dbc407d8lr f3641295pc dd9b37c4cpsr 800f0010 09-20 16:29:13.446: A/DEBUG(16497): backtrace: 09-20 16:29:13.446: A/DEBUG(16497):#00 pc 005af7c4/data/app/com.dongnaoedu.dnffmpegplayer-2/lib/arm/libavcodec-56.so (avcodec_decode_video2+36) 09-20 16:29:13.446: A/DEBUG(16497):#01 pc **00002291**/data/app/com.dongnaoedu.dnffmpegplayer-2/lib/arm/libmyffmpeg.so (init_avcodec_decode_video2
-
找到錯誤碼
在上面複製出來的日誌裡找到錯誤碼(00002291)
09-20 16:29:13.446: A/DEBUG(16497):#01 pc **00002291**/data/app/com.dongnaoedu.dnffmpegplayer-2/lib/arm/libmyffmpeg.so
-
找到專案obj/local/armeabi檔案目錄
E:/workspace1.0/jni/dn_ffmpeg_player/obj/local/armeabi
-
在cmd視窗輸入命令:
arm-linux-androideabi-addr2line -e +.obj/local/armeabi檔案目錄+錯誤碼
adb logcat : ndk-stack -sym E:/workspace1.0/jni/dn_ffmpeg_player/obj/local/armeabi 00002291
-
在cmd視窗可以定位到錯誤的行號
E:\workspace1.0\jni\dn_ffmpeg_player/jni/dn_player.c:68
-
迴歸程式碼找到錯誤並更改
從上面可以得出現錯誤的行號 68,找到錯誤並更改
-
image

image