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
目录
相关文章
|
23天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
18 1
|
2月前
|
Android开发 数据安全/隐私保护 iOS开发
安卓与iOS系统的发展趋势与比较分析
【2月更文挑战第6天】 在移动互联网时代,安卓和iOS系统作为两大主流移动操作系统,各自呈现出不同的发展趋势。本文将从技术角度出发,对安卓和iOS系统的发展方向、特点及未来趋势进行比较分析,以期为读者提供更深入的了解和思考。
33 4
|
3月前
|
监控 Android开发 C语言
深度解读Android崩溃日志案例分析2:tombstone日志
深度解读Android崩溃日志案例分析2:tombstone日志
81 0
|
3月前
|
数据安全/隐私保护 Android开发
2023安卓逆向 -- 某合伙apk登录加密分析
2023安卓逆向 -- 某合伙apk登录加密分析
26 0
|
7月前
|
Java Android开发
Android oom pthread_create (1040KB stack)分析及解决
Android oom pthread_create (1040KB stack)分析及解决
84 0
|
2月前
|
网络协议 算法 Android开发
安卓逆向 -- 实战某峰窝APP(动态分析)
安卓逆向 -- 实战某峰窝APP(动态分析)
24 4
|
2月前
|
安全 搜索推荐 Android开发
Android 与 iOS 的比较分析
【2月更文挑战第5天】 Android 和 iOS 是目前市场上两种最流行的移动操作系统,它们都拥有自己的特点和优势。本文将会分别从操作系统设计、应用生态、安全性等方面对这两种操作系统进行比较和分析,希望能够帮助读者更好地选择适合自己的移动设备。
|
3月前
|
安全 算法 JavaScript
安卓逆向 -- 关键代码定位与分析技术
安卓逆向 -- 关键代码定位与分析技术
39 0
|
3月前
|
算法 安全 Android开发
安卓逆向 -- Frida Hook某车_sign算法分析
安卓逆向 -- Frida Hook某车_sign算法分析
76 0
|
3月前
|
安全 Android开发 数据安全/隐私保护
安卓逆向 -- SO文件逆向分析
安卓逆向 -- SO文件逆向分析
19 0