一,使能 kernel config
可以是 kernel/msm-5.4/arch/arm64/configs/defconfig
或者:kernel/configs/r/android-5.4/android-base.config
添加一行
CONFIG_COREDUMP=y
二,关闭linker的信号拦截
关闭linker的信号拦截之后,kernel 默认会处理信号。
bionic/linker/linker_main.cpp::linker_main() 函数里面注释掉如下函数:
//linker_debuggerd_init(); enable_coredump
三, 关闭debuggerd的handler注册
关闭debuggerd的handler注册,是为了避免因为dump或者intercept产生了过多的coredump.
system/core/debuggerd/handler/debuggerd_handler.cpp
void debuggerd_init(debuggerd_callbacks_t* callbacks) 函数里面,注释掉:
//debuggerd_register_handlers(&action); enable_coredump
四,修改init.rc
任意能否编译到的init.rc即可。比如init.target.rc
由于要使用/data分区,所以这个阶段要在/data分区解密完成以后。
on post-fs-data
# enable_coredump
setrlimit 4 -1 -1
setrlimit core -1 -1
#ulimit -c unlimited
write /proc/sys/fs/suid_dumpable 1
write /proc/sys/kernel/core_uses_pid 1
mkdir /data/coredump 0777 system system
write /proc/sys/kernel/core_pattern /data/coredump/core.%e.%p
五,修改selinux权限
临时提升成permissive.
system/core/init/selinux.cpp
index 0ba5c4ae3..748c15b32 100644
--- a/init/selinux.cpp
+++ b/init/selinux.cpp
@@ -76,7 +76,7 @@ selabel_handle* sehandle = nullptr;
enum EnforcingStatus { SELINUX_PERMISSIVE, SELINUX_ENFORCING };
EnforcingStatus StatusFromCmdline() {
- EnforcingStatus status = SELINUX_ENFORCING;
+ EnforcingStatus status = SELINUX_PERMISSIVE;
六,测试
1|android:/ # kill -6 `pidof surfaceflinger`
查看 /data/coredump 文件夹下面是否生成该进程的coredump
android:/ # ls /data/coredump |grep surfaceflinger
core.surfaceflinger.731