Coredump介绍及如何在Android中开启和使用来分析Crash等问题

简介: 文章目录: Coredump简介及使用... 1 目录... 2 一、什么是Coredump. 3 二、Coredump产生的原因... 3 三、如何控制产生Coredump.

文章目录:

Coredump简介及使用... 1

目录... 2

一、什么是Coredump. 3

二、Coredump产生的原因... 3

三、如何控制产生Coredump. 4

四、使用Coredump的准备... 4

五、开始使用Coredump. 5


一、什么是Coredump

有些C/C++程序或者通过JNI调用了C/C++的APK程序可以通过编译, 但在运行时会出现错误,比如常见的signal 11 (SIGSEGV),这样的程序都是可以通过编译的,而且这样的错误一般情况下不会像编译错误一样告诉你具体在代码的那一行有问题,所以调试起来比较困难和麻烦。

因为上面的这种debug困难的情况,所以就产生了coredump这种机制(很多操作系统都支持这种机制,并不是Linux独有,也不是专门为Android而生),系统(或者标准库)在发现程序错误的异常退出时,就会把程序当时整个进程的状态dump 出来,生成一个coredump文件,通常情况下coredump包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等,可以理解为把程序工作的当前状态存储成一个文件,很幸运,我们现在使用Android系统是基于Linux内核,Linux内核原生就支持这种机制。

二、Coredump产生的原因

造成程序coredump的原因很多,这里根据以往的经验总结一下:

1、  内存访问越界

  a) 由于使用错误的下标,导致数组访问越界
  b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
  c) 使用strcpy,strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy,strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

2、  多线程程序使用了线程不安全的函数

第1类:不保护共享变量的函数

第2类:保持跨越多个调用的状态函数

第3类:返回指向静态变量指针的函数

第4类:调用线程不安全函数的函数

3、  多线程读写的数据未加锁保护

一个线程做完条件判断准备使用时发生了调度,另外一个线程将其释放并置空或者修改了内容,就会导致程序执行流错乱,要么指针异常,要么状态错乱发生另外的异常

4、  非法指针

a)    使用空指针

b)    随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型 的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它 时就很容易因为bus error而core dump

c)    使用未初始化或者已经释放或者状态不明的野指针

5、  堆栈溢出

不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误

三、如何控制产生Coredump

直接修改init.rc(system/core/rootdir)文件,在setrlimit13 40 40后面添加:

  setrlimit 4 -1 -1

  mkdir /data/coredump 0777 system system

  write /proc/sys/kernel/core_pattern/data/coredump/core.%e.%p

  write /proc/sys/fs/suid_dumpable 1

这些命令的目的是将RLIMIT_CORE的大小修改为unlimited,具体参见:keywords.h中do_setrlimit函数。其中RLIMIT_CORE的定义在Resource.h中。在data目录下创建coredump文件夹,并给系统赋予可读可写权限。改写coredump文件的存储路径。使调用了seteuid()/setegid()的程序能够生成coredump,默认情况下系统不会为这些进程生成Coredump,需要设置suid_dumpable为1。

尽管是做了上面这些动作,但是仍然只能为native程序产生coredump,对于由zygotefork的apk进程则不会生成coredump,因为zygote在做初始化的时候会忽略Linux的配置,使用默认不生成coredump的配置,system server同样是由zygote fork的,所以也不会产生coredump,所以如果出现因为system server的thread crash引起的重启则会非常头疼,需要为system server配置生成coredump,如果其他apk进程需要产生coredump同样需要在开机初始化的时候为zygote做特殊的设置。

所谓的特殊设置就是将zygote的启动参数中应用rlimit的配置,system server也是同样。

四、使用Coredump的准备

通过设置在出问题时产生了coredump,接下来我们就要使用这个coredump为我们分析具体的问题。工欲善其事必先利其器,我们首先要准备好解析coredump的环境和工具。

1、GDB,由于我们是分析嵌入式Linux内核下的产生的coredump,所以我们需要专门的交叉编译工具链中的arm-linux-androideabi-gdb,大概位置:

prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gdb

2、有了GDB还不够,我们需要更加人性化、简单易操作的图形化工具—Eclipse+CDT来查看coredump

如何获得:

a、Eclipse C/C++ IDE for Luna SR2.click to download bundle package.

b、在ADT中更新你的CDT插件,help-》install newsoftware-》type url:http://download.eclipse.org/tools/cdt/releases/8.6

3、准备与coredump版本对应的源代码环境,最好与编译版本时的路径保持一致,以便定位具体的代码

4、准备与coredump版本对应的symbols

五、开始使用Coredump

这个章节含有大量指导配置环境的图片,请需要的同学直接下载文档:

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
191 4
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
4月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
55 2
|
1月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
30 8
|
3月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
91 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
42 1
|
3月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
4月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
159 3
|
3月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
4月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。