在平常开发中,经常碰到进程异常崩溃退出的情况,这时候最便捷的方法就是生成core文件,然后通过gdb在查看程序崩溃时的调用栈,一般很快就能定位出问题。 linux系统中程序异常崩溃时默认是不会自动生成core文件的,这时候我们一般需要使用以下命令将core文件生成开关打开,然后再在终端手动拉起进程,当进程再次崩溃时就会生成core文件。
# 将coresize从默认的0改成无限制 ulimit -c unlimited # 因为我们的rootfs是只读的,所以需要将core文件生成路径从默认的当前路径改为/var/core echo /var/core >/proc/sys/kernel/core_pattern
但是ulimit命令是有作用范围的,事实上ulimit限制的是当前shell进程以及其派生的子进程,所以通过ulimit修改coresize只是针对在当前shell下启动的子进程,而不能影响其他shell下启动的进程。而pc进程是一个精灵进程,由它启动的进程都是属于其他shell了,所以通过pc进程启动的子进程是无法生成core文件的。
那么怎么才能让指定的进程崩溃时生成core文件呢?
带着这个疑问,我查看了busybox中的ash的源码,发现ash中实现的ulimit命令最终是通过调用setrlimit函数来实现对coresize参数的设置。增加一个enableCoreDump函数用于开启coredump的功能,对于想要生成core文件的程序,只需要在启动时调用enableCoreDump(1),即可在程序崩溃时生成core文件。
int enableCoreDump(int iFlag) { int iRes = RLIMIT_CORE; struct rlimit stRlim; /* 允许生成core文件 */ stRlim.rlim_cur = stRlim.rlim_max = iFlag ? RLIM_INFINITY : 0; if (0 != setrlimit(iRes, &stRlim)) {