首页 > 其他分享 >coredump配置、产生、分析以及分析示例

coredump配置、产生、分析以及分析示例

时间:2022-11-17 12:23:52浏览次数:78  
标签:分析 core 示例 coredump Core 3n 3c 内存

应用程序在运行过程中由于各种异常或者bug导致退出,在满足一定条件下产生一个core文件。

什么是coredump?

通常情况下coredmp包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等。可以理解为把程序工作的当前状态存储成一个文件。许多程序和操作系统出错时会自动生成一个core文件。

如何使用coredump?

coredump可以用在很多场合,使用Linux,或者solaris的人可能都有过这种经历,系统在跑一些压力测试或者系统负载一大的话,系统就hang住了或者干脆system panic.这时唯一能帮助你分析和解决问题的就是coredump了。

现在很多应该程序出错时也会出现coredump.

1. 配置coredump

如果需要使用需要通过ulimit进行设置,可以通过ulimit -c查看当前系统是否支持coredump。如果为0,则表示coredump被关闭。

通过ulimit -c unlimited可以打开coredump。

coredump文件默认存储位置与可执行文件在同一目录下,文件名为core。

可以通过/proc/sys/kernel/core_pattern进行设置。

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

通过echo "core-%e-%p-%s-%t" > /proc/sys/kernel/core_pattern。

在每个进程下都有coredump_filter节点/proc/<pid>/coredump_filter。

通过配置coredump_filter可以选择需在coredump的时候,将哪些内容dump到core文件中。

2. coredump原理

在do_signal()中根据信号判断是否触发coredump,当然还跟coredump limit、mm->flags等等相关。

满足coredump条件后,由do_coredump()进行coredump文件生成,核心是由binfmt->core_dump()进行的。

3. coredump原因

造成程序coredump的原因很多,这里根据以往的经验总结一下:

1 内存访问越界
  a) 由于使用错误的下标,导致数组访问越界
  b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
  c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。
 
2 多线程程序使用了线程不安全的函数。
应该使用下面这些可重入的函数,尤其注意红色标示出来的函数,它们很容易被用错:
asctime_r(3c) gethostbyname_r(3n) getservbyname_r(3n) ctermid_r(3s) gethostent_r(3n) getservbyport_r(3n) ctime_r(3c) getlogin_r(3c) getservent_r(3n) fgetgrent_r(3c) getnetbyaddr_r(3n) getspent_r(3c) fgetpwent_r(3c) getnetbyname_r(3n) getspnam_r(3c) fgetspent_r(3c) getnetent_r(3n) gmtime_r(3c) gamma_r(3m) getnetgrent_r(3n) lgamma_r(3m) getauclassent_r(3) getprotobyname_r(3n) localtime_r(3c) getauclassnam_r(3) etprotobynumber_r(3n) nis_sperror_r(3n) getauevent_r(3) getprotoent_r(3n) rand_r(3c) getauevnam_r(3) getpwent_r(3c) readdir_r(3c) getauevnum_r(3) getpwnam_r(3c) strtok_r(3c) getgrent_r(3c) getpwuid_r(3c) tmpnam_r(3s) getgrgid_r(3c) getrpcbyname_r(3n) ttyname_r(3c) getgrnam_r(3c) getrpcbynumber_r(3n) gethostbyaddr_r(3n) getrpcent_r(3n)
 
3 多线程读写的数据未加锁保护。
对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump
 
4 非法指针
  a) 使用空指针
  b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型 的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它 时就很容易因为bus error而core dump.
 
堆栈溢出
不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

标签:分析,core,示例,coredump,Core,3n,3c,内存
From: https://www.cnblogs.com/chuting/p/16899057.html

相关文章

  • 交叉表应用示例
    createtableA(Namevarchar(10),Provincevarchar(20),Scoreint)insertAselect'李三','四川',5unionselect'小王','四川',3unionselect'小張','廣州',3uni......
  • Zerocash安全性分析
    本文对Zerocash做了简单分析,主要内容参考Zerocash原文。完整文件下载......
  • Linux内存泄露案例分析和内存管理分享
    作者:李遵举一、问题近期我们运维同事接到线上LB(负载均衡)服务内存报警,运维同事反馈说LB集群有部分机器的内存使用率超过80%,有的甚至超过90%,而且内存使用率还再不停的增长......
  • 2021陇剑杯(真流量分析与取证杯)题目复现
    JWT看session很明显使用了jwtid和username需要去解jwt就可以得到坑点:不要只看前半部分迷惑流量没有的到权限所以说这部分流量可以忽略,往后翻这条流量权限就变成了root,所以这......
  • 常规web流量分析总结及例题(普通http流量,http传输文件流量,https加密流量,视频流)
    web流量分析基本套路流量分析传输了数据:ziprarpngjpgtxtmp3,特别是流量包比较大时需要注意binwalk分离文件,grep或者wireshark内ctrl+f搜索分情况使用导出对象,导出分组字......
  • 方差分析—单因素方差分析(R语言)
    方差分析是由英国著名统计学家:R.A.Fisher推导,也叫F检验,用于多个样本间均数的比较(分析类别变量(有序变量))。当包含的因子是解释变量时,关注的重点通常会从预测转向组别差异......
  • 中国裁决文书网,js算法分析
    author:sky_dadate:2022-11-171-1引入基本算法库CryptoJSvarCryptoJS=CryptoJS||function(y,h){varj={},g=j.lib={},f=functi......
  • js 函数行为分析
    一、function关键字1//定义一个具名函数2functionfoo(){}3console.log(foo);//ƒfoo(){}4console.log(foo.name);//foo56//foo赋值给一个......
  • Futex-3—Noraml Futex驱动分析
    基于Linux-5.15,下文中进程和线程同指向。一、NoramlFutex驱动简介futex驱动提供一种内核阻塞用户空间进程的机制。futex系统调用提供了三种配对的调用接口,满足不同使用......
  • Python数据分析
    一、Python数据分析之Numpy0.数组的引入假设我们想将列表中的每个元素增加1,但列表不支持这样的操作:a=[1,2,3,4]a+1#报错#但可以这样操作[x+1forxina]数......