coredump是什么?
coredump一般我们说是核心转储,就是在进程异常时的一个快照,保存了异常时的内存、寄存器、堆栈等数据。这些数据存储成一个文件,而且是一个ELF文件格式,可通过readelf读取查看。
为何需要coredump?
在android系统上,一般程序在native或者art中异常后会在data/tombstones下生成对应的tombstone文件,这个文件一般已经包含了很多native程序的重要信息,结合symbol,我们会对异常原因有个初步判断,而且一般的简单问题可以有个初步分析结论。但对于较难的问题,仅有tombstone不足以判断异常原因,尤其是需要查看一些较多分支,对象地址数据没有在tombstone中输出时,我们就需要更多的寄存器和内存信息。这就需要抓起coredump来分析。
如何抓取coredump?
1,设置要抓取进程的rlimit
#define RLIM_INFINITY 0x7fffffffUL
......
221 rl.rlim_cur = RLIM_INFINITY;
222 rl.rlim_max = RLIM_INFINITY;
223 if (setrlimit(RLIMIT_CORE, &rl) < 0) {
//异常打印
}
上面即设置core文件大小不限。
在android中,不同平台调用时机有区别,以某平台调用时机为例,在zygote fork进程时执行,其时序如下:
//frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
487static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
488 jint debug_flags, jobjectArray javaRlimits,
489 jlong permittedCapabilities, jlong effectiveCapabilities,
490 jint mount_external,
491 jstring java_se_info, jstring java_se_name,
492