在解决app/frameworks客户问题的过程中经常碰到段错误的问题,在Aplog中搜索fatal关键字会碰到类似F/libc    ( 6721): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 7185 (TimedEventQueue)的信息。段错误的出现有以下原因:

1、空指针

2、内存地址被挤占,值不为空,但访问的对象或者变量挂掉了

3、内存不足,提示low memory等信息

碰到段错误最主要是看tombstone log,其主要结构包括Header,Backtrace,Register,Memory,Stack等,实例如下

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

Build fingerprint: 'intel/anzhen4_mrd7_64/anzhen4_mrd7:5.0/LRX21V/lirhett02091150:userdebug/dev-keys'

Revision: '0'

ABI: 'x86'

pid: 1785, tid: 1789, name: Compiler driver >>> /system/bin/dex2oat <<<

signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------

Abort message: 'art/compiler/dex/quick/x86/utility_x86.cc:491] Bad case in OpRegRegReg OpMul'

eax 00000000 ebx 000006f9 ecx 000006fd edx 00000006

esi f42ffdb8 edi 00000000

xcs 00000023 xds 0000002b xes 0000002b xfs 00000087 xss 0000002b

eip f7672826 ebp 000006fd esp f42ff460 flags 00000206

backtrace:

#00 pc 00085826 /system/lib/libc.so (tgkill+22)

#01 pc 000310a3 /system/lib/libc.so (pthread_kill+163)

#02 pc 00032975 /system/lib/libc.so (raise+37)

#03 pc 0002ac65 /system/lib/libc.so (abort+85)

#04 pc 00375ff7 /system/lib/libart.so (art::Runtime::Abort()+295)

#05 pc 000ea904 /system/lib/libart.so (art::LogMessage::~LogMessage()+1668)

#06 pc 0016f5cb /system/lib/libart-compiler.so (art::X86Mir2Lir::OpRegRegReg(art::OpKind, art::RegStorage, art::RegStorage, art::RegStorage)+507)

#07 pc 0015c609 /system/lib/libart-compiler.so (art::X86Mir2Lir::GenArithOpInt(art::Instruction::Code, art::RegLocation, art::RegLocation, art::RegLocation)+3401)

#08 pc 0012a747 /system/lib/libart-compiler.so (art::Mir2Lir::CompileDalvikInstruction(art::MIR*, art::BasicBlock*, art::LIR*)+2087)

#09 pc 0012d19a /system/lib/libart-compiler.so (art::Mir2Lir::MethodBlockCodeGen(art::BasicBlock*)+314)

#10 pc 0012d4ef /system/lib/libart-compiler.so (art::Mir2Lir::MethodMIR2LIR()+255)

#11 pc 000f014a /system/lib/libart-compiler.so (art::Mir2Lir::Materialize()+186)

#12 pc 0015dbc4 /system/lib/libart-compiler.so (art::X86Mir2Lir::Materialize()+36)

#13 pc 00188446 /system/lib/libart-compiler.so

#14 pc 0012dee6 /system/lib/libart-compiler.so (art::QuickCompiler::Compile(art::DexFile::CodeItem const*, unsigned int, art::InvokeType, unsigned short, unsigned int, _jobject*, art::DexFile const&) const+166)

#15 pc 001ba189 /system/lib/libart-compiler.so (art::CompilerDriver::CompileMethod(art::DexFile::CodeItem const*, unsigned int, art::InvokeType, unsigned short, unsigned int, _jobject*, art::DexFile const&, art::DexToDexCompilationLevel)+1897)

#16 pc 001baeb4 /system/lib/libart-compiler.so (art::CompilerDriver::CompileClass(art::ParallelCompilationManager const*, unsigned int)+2404)

#17 pc 001a7b8c /system/lib/libart-compiler.so (art::ParallelCompilationManager::ForAllClosure::Run(art::Thread*)+44)

#18 pc 003a0f6b /system/lib/libart.so (art::ThreadPoolWorker::Run()+75)

#19 pc 003a20ea /system/lib/libart.so (art::ThreadPoolWorker::Callback(void*)+90)

#20 pc 00030079 /system/lib/libc.so (__pthread_start(void*)+57)

#21 pc 0002b3ca /system/lib/libc.so (__start_thread+26)

#22 pc 00012c46 /system/lib/libc.so (__bionic_clone+70)

在分析tombstone log的时候注意几点

1、我比较熟悉的调试工具是ndk-stack,用法为ndk-stack -sym -dump 。ndk-stack命令相当于调用了多条addr2line命令解析crash文件的每一行Log。objdump是通过汇编语言定位问题。

2、lib目录最好是带符号的链接库,目录为out/target/product/xxx/symbols/system/lib,而不是out/target/product/xxx/system/lib

3、ndk-stack后显示文件名,函数名,行数等信息,从下倒上依次分析,定位问题发生点

分析:http://bootloader.wikidot.com/linux:android:crashlog

ndk-stack工具下载:http://developer.android.com/tools/sdk/ndk/index.html

android ndk 段错误,android crash之段错误原因及分析方法相关推荐

  1. 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

    文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  2. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  3. 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )

    文章目录 I . CMake 简介 II . Android Studio 中 CMake 引入静态库流程 III . 指定 CMake 最小版本号 IV . 导入函数库 ( 静态库 / 动态库 ) ...

  4. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  5. 【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )

    文章目录 I . 源码编译配置 II . 构建脚本配置 III . NDK 函数库打包配置 IV . Java 与 C 代码示例 V . CMake 配置 ( CMakeLists.txt ) VI ...

  6. Android NDK 概述(Android NDK Overview)

    Android NDK 功能概述 Android NDK就是一套用于把C/C++源码编译得到的二进制机器码嵌入应用安装包的工具. Android NDK是对Android SDK的一个补充,可以帮助你 ...

  7. android ndk: aborting . stop,Android NDK:Aborting..Stop的处理方法

    在eclipse中配置cocos2d-x的android环境时,遇到这样的错误提示 网上搜索了一下,说是在NDK_MODULE_PATH环境变量下未找到所需要的Android.mk文件,后来仔细研究了 ...

  8. android ndk 博客,Android Studio 2上利用NDK进行OpenCV 3.1开发

    本文主要分为两部分,第一部分采用实验性插件(Gradle Experimental Plugin)建立一个一般性的NDK应用,第二部分采用稳定版插件建立一个简单的灰度处理的OpenCV JNI应用. ...

  9. 【Android NDK 开发】Android NDK 下载 ( 下载指定历史版本 NDK | Android NDK r10e - 2015 年 5 月 )

    文章目录 一.下载指定历史版本 NDK 一.下载指定历史版本 NDK 进入到 ndk 下载的 " 修订历史记录 " 页面 https://developer.android.goo ...

  10. protobuf android ndk,直接在Android NDK端使用tensorflow(不使用JAVA api)

    这是我如何解决这个问题.虽然没有太多关于在an​​droid上使用c apis以及编译和链接tensorflow到NDK的文档,但是makefile有重要的注释以及相关的脚本.编译步骤与ios非常相似 ...

最新文章

  1. 怎么帮java转换成类图_有把java代码直接转成uml类图的工具吗 – 手机爱问
  2. 地区的json数据_Python 连接开放航空交通数据,轻松构建航班跟踪应用!
  3. Android adb命令,linux中各种命令
  4. SCI论文写作--IEEE的期刊和杂志区分
  5. java回收类_Java的内存回收——Java引用的种类
  6. 十大排序算法之归并排序
  7. 用公众号获取 任意公众号文章列表 软件还是免费
  8. Win10 连接 Ubuntu16.04.3(通过Xdrp连接xfce4界面)
  9. 高铁是如何跑起来?列车头顶高压线为什么磨不坏?
  10. 【转载】关于RabbitMQ的高可用性
  11. 记一次解决curl https证书问题
  12. Git学习总结(1)——Git使用详细教程
  13. 最简单的视频编码器:编译(libx264,libx265,libvpx)
  14. zookeeper + dubbo 搭建
  15. 城市级智能网联招投标项目情况全扫描(2021版)
  16. python处理cad_pyautocad python 操作CAD文件
  17. 雪人(snowman)
  18. java禁止夏令时_在指定时区导入日期时间,忽略夏令时
  19. Excel设置图片固定在某个单元格内部
  20. 前缀后缀表达式 表达式X=A+B*(C-D)/E+F的后缀表示形式可以为( )

热门文章

  1. linux的终端下的命令行管道|的简单实现
  2. java log4j 异步_Log4j2异步日志之异步格式化
  3. win10连接VMWare下的Ubutun系统进行FPT文件传输
  4. Java的jdk在win10安装配置环境变量
  5. linux mysql 编码修改吗_Linux下mysql 修改编码
  6. Docker实践(三)容器
  7. java 返回两个值_Java - Number类
  8. OpenShift 4 之在不同的项目之间推送Image
  9. 统一并发 II——基准测试方法
  10. 创建用于图像大小调整和裁剪器保持纵横比的ASP.NET控件