玩转centos 下的core 文件
author: hjjdebug
date: 2024年 03月 06日 星期三 12:38:35 CST
description: 玩转centos 下的core 文件
一: 准备一个会产生core 的文件
cat main.cpp
int main(void)
{
char *p=0;
*p=123;
return 0;
}
编译并执行之
./temp
段错误(吐核)
但是查看当前目录却没有生成core文件
$ ls
main.cpp main.o Makefile temp temp.pro
二: 原因查找:
ulimit -a |grep core
core file size (blocks, -c) 0
core file size 为0 是不会生成core 文件的
三: 设置core size 为unlimited(不限制大小)
ulimite -c unlimited
重新执行文件
./temp
段错误(吐核)
[root@ct50 ~/temp]# ls
core.11538 main.cpp main.o Makefile temp temp.pro
即可生成core 文件, 但它是带pid 的, 每次都会生成不同的core 文件,不方便查找且浪费空间.
怎样 把core 文件名称修改为core, 去掉pid ?
这需要修改系统参数. 可以借用sysctl 命令. 当然也可以不用,灵活掌握最重要!
sysctl 命令简单介绍:
Linux中的sysctl支持需要Procfs,
可以使用sysctl读取和写入sysctl数据。 可用参数是/proc/sys/下列出的参数。
sysctl -a 可列出所有系统参数, 配合grep 可以顾虑出感兴趣的参数
sysctl -w 可以修改参数的值
例如:
sysctl -w net.core.rmem_max=26214400 //修改网络内核读缓存的大小
临时修改也可以直接修改/proc/sys 下对应的参数.
如果想使修改在下次开机时生效, 可以直接编辑/etc/sysctl.conf文件
将内核参数写入配置文件中,需要使用sysctl -p命令重新加载配置文件使参数生效。
四: 查看当前core 的生成状态:
$sysctl -a | grep kernel|grep core
kernel.core_pattern = |/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e %P %I %h
kernel.core_pipe_limit = 4
kernel.core_uses_pid = 1 //我们关心的是这个
可见core 是使用了pid 的
把它临时改为不使用pid, 进入/proc/sys/kernel 目录
查看:
$ls core*
core_pattern core_pipe_limit core_uses_pid
直接查看值也可以
$ cat core_uses_pid
1
五: 修改内核参数
$ echo 0 > core_uses_pid
用sysctl -w 也可以,这里就忽略了.
六: 再次查看:
$ cat core_uses_pid
0
用sysctl 查看看
$ sysctl -a |grep kernel|grep core
kernel.core_pattern = |/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e %P %I %h
kernel.core_pipe_limit = 4
kernel.core_uses_pid = 0
可见它们结果是一致的.