android ndk开发 定位native层c/c++语言的错误行号,崩溃行号。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lakebobo/article/details/79661864

mac系统 android studio ndk 开发时候,android层的崩溃或者报错,as是可以定位到具体哪行的,但是,我们在ndk编译c语言时候,c如果有逻辑出错,崩溃,as运行日志是打印不出来具体哪行报错,导致程序崩溃,为了定位c语言 native层的崩溃代码行号,addr2line的方法试了没有任何效果,找到以下方案可用。而且还是实时的打印。非常的方便。

1.运行终端。 跳转到你android sdk 目录 因为你的adb 在里面。如 :

cd /Users/lake/Library/Android/adt-bundle-mac-x86_64-20131030/sdk/platform-tools 

2、找了路径正确继续下一步,./adb logcat | 你android ndk-stack所在的路径 -sym /你安卓工程.so文件所在的目录,如:

./adb logcat | /Users/lake/Library/Android/sdk/ndk-bundle/ndk-stack -sym /Users/lake/test/NDKAudioTest/app/build/intermediates/transforms/mergeJniLibs/debug/0/lib/armeabi

3、正确配置后会在终端出现

  • waiting for device -
    4、AndroidManifest.xml 设置 Debuggable 为true 在Application 切页中
    5、另外启动一个终端 编译android工程
    6、ADT连接设备运行你的工程就行了,出现崩溃的话会在你前面配置的终端里面打印出来。
********** Crash dump: **********
Build fingerprint: 'Xiaomi/gemini/gemini:7.0/NRD90M/8.3.8:user/release-keys'
pid: 16488, tid: 17530, name: Thread-9  >>> com.lake.ndkaudiotest <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Stack frame #00 pc 00049b48  /system/lib/libc.so (tgkill+12)
Stack frame #01 pc 000472c3  /system/lib/libc.so (pthread_kill+34)
Stack frame #02 pc 0001d565  /system/lib/libc.so (raise+10)
Stack frame #03 pc 000190b1  /system/lib/libc.so (__libc_android_abort+34)
Stack frame #04 pc 00017114  /system/lib/libc.so (abort+4)
Stack frame #05 pc 0001b55f  /system/lib/libc.so (__libc_fatal+22)
Stack frame #06 pc 000667ff  /system/lib/libc.so (ifree+962)
Stack frame #07 pc 000668c7  /system/lib/libc.so (je_free+74)
Stack frame #08 pc 000011af  /data/app/com.lake.ndkaudiotest-2/lib/arm/libnative-lib.so (_Z22releaseFFmpegAudioPlayv+22): Routine releaseFFmpegAudioPlay() at /Users/lake/test/NDKAudioTest/app/src/main/cpp/native-lib.cpp:57
Stack frame #09 pc 00001289  /data/app/com.lake.ndkaudiotest-2/lib/arm/libnative-lib.so (_Z8shutdownv+156): Routine shutdown() at /Users/lake/test/NDKAudioTest/app/src/main/cpp/native-lib.cpp:91
Stack frame #10 pc 0000216b  /data/app/com.lake.ndkaudiotest-2/lib/arm/libnative-lib.so (Java_com_lake_ndkaudiotest_MainActivity_stop+18): Routine Java_com_lake_ndkaudiotest_MainActivity_stop at /Users/lake/test/NDKAudioTest/app/src/main/cpp/native-lib.cpp:373
Stack frame #11 pc 000ae699  /system/lib/libart.so (art_quick_generic_jni_trampoline+40)
.....此处省略

重要的就是 cpp 行号。为我们定位崩溃地点很有作用,再结合程序的打印输出位置,就能很快定位问题了。

阅读更多

没有更多推荐了,返回首页