Android——coredump 配置

Coredump简介及使用 Android Coredump简介及使用_v1.0_201504281025.pdf 立即下载

撰写不易,转载需注明出处:http://blog.youkuaiyun.com/jscese/article/details/46699117本文来自 【jscese】的博客!


kernel支持:

由linux支持,进程崩溃时记录存储堆栈空间,寄存器等相关内容,保留致命现场数据,便于分析查找根源。
编译项:

Symbol: COREDUMP [=y] 
Type  : boolean
Prompt: Enable core dump support
  Location:
(1) -> Userspace binary formats
 Defined at fs/Kconfig.binfmt:182  

/kernel/signal.c中的信号处理函数:get_signal_to_deliver中有这么一段:

        if (sig_kernel_coredump(signr)) {
            if (print_fatal_signals)
                print_fatal_signal(info->si_signo);
            proc_coredump_connector(current);
            /*
             * If it was able to dump core, this kills all
             * other threads in the group and synchronizes with
             * their demise.  If we lost the race with another
             * thread getting here, it set group_exit_code
             * first and our do_group_exit call below will use
             * that value and ignore the one we pass it.
             */
            do_coredump(info);
        }

展开宏如下:

(((signr) < 32) && ((1UL << ((signr) - 1)) & ((\
        (1UL << ((3) - 1))   |  (1UL << ((4) - 1))    | \
    (1UL << ((5) - 1))   |  (1UL << ((6) - 1))   | \
        (1UL << ((8) - 1))    |  (1UL << ((11) - 1))   | \
    (1UL << ((10) - 1))    |  (1UL << ((12) - 1))    | \
        (1UL << ((24) - 1))   |  (1UL << ((25) - 1))   | \
    (1UL << ((7) - 1))      

可对照signal列表查看,

do_coredump函数实现在/fs/coredump.c

void do_coredump(siginfo_t *siginfo)
{
...
struct mm_struct *mm = current->mm;
struct linux_binfmt * binfmt;
...
    struct coredump_params cprm = {
        .siginfo = siginfo,
        .regs = signal_pt_regs(),
        .limit = rlimit(RLIMIT_CORE),  //获取当前进程的rlimit
        /*
         * We must use the same mm->flags while dumping core to avoid
         * inconsistency of bit flags, since this flag is not protected
         * by any locks.
         */
        .mm_flags = mm->flags,
    };
...
binfmt = mm->binfmt;
...
    if (cprm.limit < binfmt->min_coredump)    //判断rlimit 必须大于定的一个最小值: 
            goto fail_unlock;
...
}
这个最小值定义在binfmt_elf.c中
static struct linux_binfmt elf_format = {
    .module     = THIS_MODULE,
    .load_binary    = load_elf_binary,
    .load_shlib = load_elf_library,
    .core_dump  = elf_core_dump,
    .min_coredump   = ELF_EXEC_PAGESIZE,
};

#define ELF_EXEC_PAGESIZE 4096

kernel中的就先记录这些准备信息,如有需要可再深入查看coredump时抓取存储的细节


Android native 层面配置

上patch:

diff --git a/init.{ro.hardware}.rc b/init.{ro.hardware}.rc
index 8571839..a161071 100755
--- a/init.{ro.hardware}.rc
+++ b/init.ro.hardware.rc
@@ -106,6 +106,10 @@ on fs
mount debugfs none /sys/kernel/debug
+    # config coredump
+   mkdir /data/coredump 0777 system system
+   checkenable /data/coredump/enable
+   # end


diff --git a/init/builtins.c b/init/builtins.c
index 81f9b2c..c21a192 100755
--- a/init/builtins.c
+++ b/init/builtins.c
@@ -949,3 +949,60 @@ int do_wait(int nargs, char **args)
     } else
         return -1;
 }
+
+/*(jiangbin: command check enable from file;operation )*/
+int do_checkenable(int nargs, char **args) {
+
+   int fd,len;
+   char buf[10];
+
+
+   ERROR("do_checkenable in init");
+    if (nargs == 2) {
+
+       if((fd = open(args[1], O_RDONLY|O_CREAT, 0664)) < 0)
+       {
+           return -1;
+       }
+
+       len = read(fd, buf, sizeof buf);
+       if (len < 0) {
+           close (fd);
+           return -1;
+       }
+       close (fd);
+       buf[len] = '\0';
+       if(atoi(buf)==1) /*is enable*/
+       {
+           if(strcmp(args[1],"/data/coredump/enable")==0)
+           {
+               struct rlimit coredump;
+               memset(&coredump, 0, sizeof(struct rlimit));
+               coredump.rlim_cur = RLIM_INFINITY;
+               coredump.rlim_max = RLIM_INFINITY;
+               if(setrlimit(RLIMIT_CORE, &coredump)==0)
+               {
+                   NOTICE("in init command do_checkenable coredump cur==%lu , max==%lu pid==%lu\n",coredump.rlim_cur,coredump.rlim_max, getpid());
+               }else
+               {
+                   ERROR("setrlimit unlimit fail");
+                   return -1;
+               }
+               int iret=0;
+               iret=write_file("/proc/sys/kernel/core_pattern","/data/coredump/core.%e.%p.%s");
+               iret=write_file("/proc/sys/fs/suid_dumpable","1");
+               return iret;
+
+
+           }
+
+       }
+
+
+       return 0;
+
+    }
+    return -1;
+
+}
+/*end*/
diff --git a/init/init_parser.c b/init/init_parser.c
old mode 100644
new mode 100755
index 6466db2..569b910
--- a/init/init_parser.c
+++ b/init/init_parser.c
@@ -89,6 +89,7 @@ static int lookup_keyword(const char *s)
         if (!strcmp(s, "hown")) return K_chown;
         if (!strcmp(s, "hmod")) return K_chmod;
         if (!strcmp(s, "ritical")) return K_critical;
+        if (!strcmp(s, "heckenable")) return K_checkenable;/*jiangbin add for checkenable*/
         break;
     case 'd':
         if (!strcmp(s, "isabled")) return K_disabled;
diff --git a/init/keywords.h b/init/keywords.h
old mode 100644
new mode 100755
index 2d97e5b..cf8792d
--- a/init/keywords.h
+++ b/init/keywords.h
@@ -41,6 +41,7 @@ int do_loglevel(int nargs, char **args);
 int do_load_persist_props(int nargs, char **args);
 int do_load_all_props(int nargs, char **args);
 int do_wait(int nargs, char **args);
+int do_checkenable(int nargs, char **args);
 #define __MAKE_KEYWORD_ENUM__
 #define KEYWORD(symbol, flags, nargs, func) K_##symbol,
 enum {
@@ -104,6 +105,7 @@ enum {
     KEYWORD(load_persist_props,    COMMAND, 0, do_load_persist_props)
     KEYWORD(load_all_props,        COMMAND, 0, do_load_all_props)
     KEYWORD(ioprio,      OPTION,  0, 0)
+    KEYWORD(checkenable,        COMMAND, 1, do_checkenable)
 #ifdef __MAKE_KEYWORD_ENUM__
     KEYWORD_COUNT,
 };


作为开关添加了一个checkenable command 方便修改操作.

最终生成core文件 /data/coredump/core.%e.%p.%s 含义:

%p 出Core进程的PID
%u 出Core进程的UID
%s 造成Core的signal号
%t 出Core的时间,从1970-01-0100:00:00开始的秒数
%e 出Core进程对应的可执行文件名

可使用ulimit -c 查看


Android Application 层配置:

按道理init进程按照上面那样设置之后,它的子进程zygote应该也是具备coredump能力的,自然fork的app进程也是
但是发现在zygote fork进程之后进行的:

    private static void callPostForkChildHooks(int debugFlags, String instructionSet) {
        long startTime = SystemClock.elapsedRealtime();
        VM_HOOKS.postForkChild(debugFlags, instructionSet);
        checkTime(startTime, "Zygote.callPostForkChildHooks");
    }

中调用到 dalvik.system.ZygoteHooks 中进一步初始化
libcore/dalvik/src/main/java/dalvik/system/ZygoteHooks.java
native:
/art/runtime/native/dalvik_system_ZygoteHooks.cc

调用逻辑不多描述其中会进入这个函数:

static void EnableDebugger() {
  // To let a non-privileged gdbserver attach to this
  // process, we must set our dumpable flag.
#if defined(HAVE_PRCTL)
  if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) {
    PLOG(ERROR) << "prctl(PR_SET_DUMPABLE) failed for pid " << getpid();
  }
#endif
  // We don't want core dumps, though, so set the core dump size to 0.
  rlimit rl;
  rl.rlim_cur = 0;
  rl.rlim_max = RLIM_INFINITY;
  if (setrlimit(RLIMIT_CORE, &rl) == -1) {
    PLOG(ERROR) << "setrlimit(RLIMIT_CORE) failed for pid " << getpid();
  }
}

所以zygote fork出来的process 最后都是current rlimit_core 为0
导致无法coredump

解决办法patch如下:

diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
old mode 100644
new mode 100755
index 4f5e08b..f9782c3
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -35,6 +35,7 @@
 #include <sys/utsname.h>
 #include <sys/wait.h>

+#include <cutils/properties.h>

 #include <cutils/fs.h>
 #include <cutils/multiuser.h>
@@ -165,6 +166,26 @@ static void SetGids(JNIEnv* env, jintArray javaGids) {
   }
 }
-       delete se_name; 

+
+/*actions_code(jiangbin:native interface to setrlimit for app process:coredump)*/
+static void Zygote_nativesetrlimit()
+{
+   struct rlimit coredump;
+   memset(&coredump, 0, sizeof(struct rlimit));
+   coredump.rlim_cur = RLIM_INFINITY;
+   coredump.rlim_max = RLIM_INFINITY;
+   if(setrlimit(RLIMIT_CORE, &coredump)==0)
+   {
+       ALOGD("in zygotejni setunlimit cur==%lu , max==%lu pid==%lu\n",coredump.rlim_cur,coredump.rlim_max, getpid());
+   }else
+   {
+       ALOGE("setrlimit unlimit fail in zygotejni");
+   }
+}
+/*end*/
+
+
+
 // Sets the resource limits via setrlimit(2) for the values in the
 // two-dimensional array of integers that's passed in. The second dimension
 // contains a tuple of length 3: (resource, rlim_cur, rlim_max). NULL is
@@ -577,6 +598,17 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra
       ALOGE("Error calling post fork hooks.");
       RuntimeAbort(env);
     }
+
+    /*actions_code(jiangbin:to setrlimit for app process:coredump after PostForkChildHooks)*/
+    char propcoredump[PROPERTY_VALUE_MAX];
+    property_get("persist.sys.zygotedump", propcoredump, "");
+   if(strstr(propcoredump,se_name_c_str)!=NULL)
+   {
+      Zygote_nativesetrlimit();
+   }
+   /*end*/
+       delete se_name; 
+
   } else if (pid > 0) {
     // the parent process
   }

同样留有开关用于控制~
下篇记录 coredump 文件解析流程

GDB之在线调试与Coredump分析 GDB之在线调试与Coredump分析,通过gdb一步步分析coredump文件。 立即下载

相关推荐

自制非接触式静电探测仪:从振动电容原理到微弱信号检测实践

微弱信号检测是电子测量领域的核心挑战之一,尤其在需要避免物理接触或防止干扰的场景中。其基本原理在于将难以直接获取的微小物理量(如电流、电压)通过传感器转换为电信号,再经过放大、滤波等处理进行提取。锁相放大技术是解决这一问题的关键手段,它利用参考信号与目标信号的同步性,从强噪声背景中恢复出有效信息,极大提升了信噪比和测量灵敏度。这项技术的工程价值在于实现了对纳安级电流、微伏级电压等高难度参数的可靠测量。在静电防护、材料表面电位分析、生物电信号采集等应用场景中,非接触式测量需求广泛。本文聚焦的基于振动电容原理的

weixin_32349093的博客 274

android生成coredump,详解coredump--全面

From: http://blog.youkuaiyun.com/tenfyguo/article/details/8159176一,什么是coredump我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件。通常情况下,core文件...

weixin_39710660的博客 2797

Unity3D实战:5分钟搞定RTSP监控视频播放(附完整代码)

本文提供了一套在Unity3D中快速集成RTSP监控视频播放的实战方案。通过采用LibVLCSharp for Unity这一成熟稳定的跨平台中间件,开发者可以轻松实现RTSP流的解码与渲染,并附有完整的C#代码示例,帮助用户在5分钟内完成集成,适用于智慧园区、安防监控等3D可视化场景。

weixin_29001655的博客 191

Android系统coredump

1.打开内核coredump功能Android系统的linux内核有可能没有打开coredump功能,可以通过查看android系统是否存在/proc/sys/kernel/core_patten配置项来确定,如果没有该配置项,那么需要重新配置内核,并且重新编译,并将其替换掉目标android系统内核(具体更新方试需要根据不同的硬件而定)。下面为coredump内核配置项的具体位置:make men

飞翔de刺猬 5431

Unity3d 编译发布到安卓平台时出现的问题集

环境搭建好了,android SDK也有了,但导出的时候提示Error building Player: Win32Exception: ApplicationName='java.exe'....... 国内好像没看到解决方法。在Unity3d的论坛里面看到一个解决方法,把C:\windows\system32\java.exe复制到C:\Windows\SysWOW64里面,我这里就解决

erictang01的专栏 1773

从‘平行’到‘鱼骨’:手把手拆解AlGaN/GaN HEMT多栅指结构的布局优化实战

本文深入探讨了AlGaN/GaN HEMT多栅指结构的布局优化,从传统的平行栅结构到创新的鱼骨栅结构,详细解析了如何通过优化信号路径和热管理提升功率器件的性能。文章结合实测数据和EDA工具,展示了鱼骨栅结构在相位一致性、热阻和版图利用率方面的显著改进,为射频功率放大器设计提供了实用指导。

weixin_27061475的博客 442

Android coredump生成与APK调试

一直苦于Android底层C++代码的调试,以前都是通过打日志的方法调试的,效率极低。但是Linux下就可以用gdb 来调试coredump,那么Android应该也可以才对。 关于Linux下Coredump调试可以参考这篇文章: Linux coredump 调试 然后我按照Linux的方法设置了ulimit -c 和 coredump生成位置。结果,根本就不生成coredump文件。 一、纯C\C++生成Coredump ========================================

qq_36383272的博客 2144

存储硬盘格式怎么把512还原为520格式??

硬盘厂商工具(如SeaChestsg_format)可以调整扇区大小。备份数据,因为调整扇区会清除硬盘内容。根据硬盘型号和接口类型,选择合适的工具进行调整。如果你需要更详细的帮助,请提供你的硬盘型号和存储设备类型。希望如上措施及解决方案能够帮到有需要的你。PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

**My Coding Family** 1146

coredump在Android上的应用

之前整理过一篇linux core dump的文章,一直想把这个特性在手机上应用起来,帮助排查错误,今天终于如愿以偿,记录如下。 【1】概述 在Android系统上,java应用程序出错时很容易通过logcat获取出错信息,一般会有详细的callstack(调用栈),例如: java.lang.NullPointerException:  at com.android.provider

RationalGo的专栏 995

最新Codex接入DeepSeek官方API教程(无需cc-switch)

最新Codex接入DeepSeek官方API教程(无需cc-switch)

猿小白的博客 955

基于聚类特征工程的水果销量预测:聚类算法对比与多模型评估

水果销量预测研究:聚类分群与多模型对比 摘要 本研究提出了一种融合聚类分析与机器学习的水果销量预测方法。基于包含12个维度的销售数据集,首先采用K-Means、BIRCH和DBSCAN三种聚类算法对水果品类进行分群,通过轮廓系数等指标评估显示BIRCH算法表现最优(0.387)。随后针对不同群组构建差异化特征工程,并比较XGBoost、LightGBM和LSTM三种预测模型性能。实验结果表明:基于聚类特征工程的LightGBM模型预测效果最佳(RMSE=2.34,R²=0.87).

huanghm88的专栏 137

Android 打开coredump功能

最近要用coredump打印 c++代码在 NDK 环境中编译生成的可执行文件 所生成的错误信息,说白了就是为了调试。 然后百度怎么用coredump后 就一顿操作 。发现 设置完 ulimit -c unlimited后再次执行程序 ,还是不会打印带 (core dumped) 的错误Segmentation fault (core dumped),也没有你们文章所提到的什么 /proc/...

有点东西 4952

信息传输仿真:卫星通信系统仿真_(12).基于SystemVue的卫星通信仿真

SystemVue是Cadence公司开发的一款用于系统级设计和仿真的软件工具。它主要用于无线通信系统的设计和验证,特别是在卫星通信、雷达、射频和微波通信等领域。SystemVue提供了一个集成的环境,用户可以通过拖拽和连接各种预定义的模块来构建复杂的通信系统模型,从而进行性能分析和优化。

2401_87715305的博客 1370

android coredump,coredump功能介绍

【coredump简介】blog.youkuaiyun.com/tenfyguo/article/details/8159176【如何打开coredump功能】1、打开kernel编译开关@kernel/arch/arm/Kconfigconfig ARMbooldefault yselect HAVE_AOUTselect HAVE_DMA_API_DEBUG...+ select ELF_CO...

weixin_29582621的博客 940

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android——coredump解析

撰写不易,转载需注明出处:http://blog.youkuaiyun.com/jscese/article/details/46916869本文来自 【jscese】的博客! coredump文件生成前文Android——coredump 配置 记录了android平台上的环境配置,生成方式 正常即为process触发那几种signal 手动coredump状态:连接gdb -gcore pi...

673

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android coredump

我们开发Android本地可执行程序时,常常遇见segment fault错误,若程序比较复杂,使用打日志的方式很难查到出错的根本原因,若能让程序出core,然后用gdb 调试该core文件将能很快定位出错的代码位置,并能看到运行时出错代码的运行栈,这样能迅速定位。 1. core dump 那什么是core dump呢,core dump是指当程序运行崩溃的瞬间,内核会抛出当时该程序

ConceptCon 2983

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android coredump 调试

coredump 可以用来调试android native 进程的异常 1、coredump 在android中打开        设置coredump 大小       ulimit  -c  unlimited   //不限制coredump 大小,也可以设置为具体值 2、设置coredump 文件名称,与路径        echo "1" >  /proc/sys/ker

xiaolli的专栏 3406

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

文章目录: Coredump简介及使用... 1 目录... 2 一、什么是Coredump. 3 二、Coredump产生的原因... 3 三、如何控制产生Coredump. 4 四、使用Coredump的准备... 4 五、开始使用Coredump. 5 一、什么是Coredump 有些C...

weixin_33747129的博客 203

Android 11如何生成coredump

android R android 11下面如何生成coredump

漂流瓶の海岸 912

android导入core运行出错,android coredump

我们开发Android本地可执行程序时,常常遇见segment fault错误,若程序比较复杂,使用打日志的方式很难查到出错的根本原因,若能让程序出core,然后用gdb 调试该core文件将能很快定位出错的代码位置,并能看到运行时出错代码的运行栈,这样能迅速定位。1. core dump那什么是core dump呢,core dump是指当程序运行崩溃的瞬间,内核会抛出当时该程序进程的内存详细情...

weixin_35639750的博客 662

android eclipse debug coredump,Android P 开启抓取Coredump功能

默认情况下,Android的core dump size是被设置为0的,所以在进程crash时不会生成coredump。为了抓取coredump,需要开启该功能。下面介绍开启方法。1.修改Zygote子进程的core dump size打开art/runtime/native/dalvik_system_ZygoteHooks.cc,加入以下代码:diff --git a/runtime/nati...

weixin_34194829的博客 619

coredump

coredump 2014-01-11 12:28:58 分类: Android平台 http://blog.sina.com.cn/s/blog_5674d1880101617n.html http://blog.youkuaiyun.com/tenfyguo/article/details/8159176 一,什么是coredump         我们经常听到大家说

liushi558 806

如何分析CoreDump文件

如何分析CoreDump文件 CoreDump文件一般位于手机/data/core/目录下,如/data/core/!system!bin!app_process32.8115.QSTileHost 1.使用Eclipse ADT分析coredump Eclipse-->Run-->Debug Configurations-->C/C++ Postmortem Debu

Cosmos专栏 6164
上一篇: Linux 下 signal 机制
下一篇: 32bit - 64bit machine attention
南丶烟
博客等级 码龄14年 569粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值