NDK 使用 addr2line 定位 Fatal signal (SIGSEGV) 错误

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

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

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

[cpp]  view plain  copy
  1. android-ndk-r10\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line  

使用方式很简单

[cpp]  view plain  copy
  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 

[cpp]  view plain  copy
  1. arm-linux-androideabi-addr2line -f -e /system/lib/libstagefright.so 00000d5c  

 

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值