【我的Android进阶之旅】NDK 调试工具addr2line 的使用教程

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

使用NDK编写native code时候,真机常会出现crash的错误。然后logcat就是一片错误堆栈。


  
  
  1. I/DEBUG ( 2562): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 40123d5c
  2. I/DEBUG ( 2562): backtrace:
  3. I/DEBUG ( 2562): # 00 pc 00000d5c <unknown>
  4. I/DEBUG ( 2562): # 01 pc 0009f8db /system/lib/libstagefright.so (android::SmoothStreamingExtractor::SmoothStreamingExtractor(android::sp<android::DataSource> const&)+ 366)
  5. I/DEBUG ( 2562): # 02 pc 00082f89 /system/lib/libstagefright.so (android::MediaExtractor::Create(android::sp<android::DataSource> const&, char const*)+ 500)
  6. I/DEBUG ( 2562): # 03 pc 00045cdf /system/lib/libmediaplayerservice.so (android::AmlogicPlayerExtractorDemux::AmlogicPlayerExtractorDemux(AVFormatContext*)+ 438)
  7. I/DEBUG ( 2562): # 04 pc 0004602d /system/lib/libmediaplayerservice.so (android::AmlogicPlayerExtractorDemux::extractor_read_header(AVFormatContext*, AVFormatParameters*)+ 20)
  8. I/DEBUG ( 2562): # 05 pc 00102210 /system/lib/libamplayer.so (avformat_open_input_header+ 604)
  9. ....

曾经一直用log的方式查看揣测错误的代码行数。熟不知这些看似淫乱的错误日志其实就是错误堆栈的相关信息,只需要一个工具转换即可。

android-ndk-r10\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line
  
  

使用方式很简单


  
  
  1. // -f 输出函数名
  2. // -e 输出错误代码行数和文件路径
  3. // xxx.so 对应出错的so文件, 在android工程obj目录下
  4. // addr 是具体的地址
  5. arm-linux-androideabi-addr2line -f -e xxx.so addr

 错误日志中backtracer就是堆栈信息,#00 #01 就是堆栈列表。 #00 就是堆栈顶层就是错误所在地址,pc后面的就是地址00000d5c 
 

arm-linux-androideabi-addr2line -f -e /system/lib/libstagefright.so 00000d5c
  
  

 
 

这样瞬间就能定位错误了。。。

注意这个so文件是android工程obj目录里面的,而不是libs里面的。

obj目录是带有debug信息的库文件,libs的库文件是没有debug信息的,addr2line无法读取源代码信息。




猜你喜欢

转载自blog.csdn.net/wzy901213/article/details/82764203
今日推荐