在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 dbc407f8 r1 eef3b9f0 r2 dbc408d4 r3 eef3b9f0 09-20 16:29:13.444: A/DEBUG(16497): r4 e5ebb800 r5 dbc40970 r6 6c646e61 r7 dbc407f8 09-20 16:29:13.444: A/DEBUG(16497): r8 dbc408d4 r9 eef3b9f0 sl dbb42000 fp f36411d5 09-20 16:29:13.444: A/DEBUG(16497): ip f3643eb8 sp dbc407d8 lr f3641295 pc dd9b37c4 cpsr 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 dbc407f8 r1 eef3b9f0 r2 dbc408d4 r3 eef3b9f0 09-20 16:29:13.444: A/DEBUG(16497): r4 e5ebb800 r5 dbc40970 r6 6c646e61 r7 dbc407f8 09-20 16:29:13.444: A/DEBUG(16497): r8 dbc408d4 r9 eef3b9f0 sl dbb42000 fp f36411d5 09-20 16:29:13.444: A/DEBUG(16497): ip f3643eb8 sp dbc407d8 lr f3641295 pc dd9b37c4 cpsr 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
网友评论