coredump了解

转自:https://blog.csdn.net/qq_20553613/article/details/106672319

1.介绍

coredump(核心转储)指的是应用程序因为各种原因导致异常终止时,操作系统将应用程序的异常发生时状态信息记录为一个coredump的文件。一个coredump文件主要包含了应用程序的内存信息、寄存器状态、堆栈地址、函数调用上下文。通过该文件,可以确定程序异常发生时的调用位置,如果是堆栈溢出,还需分析多层函数的调用信息。

2.原因

2.1 内存访问越界

  • 数组下标越界
  • 超出动态(malloc/new)内存申请范围
  • 字符串没有结束符,一些函数依赖于字符串结束符,如 strcpy、strcmp、sprintf

2.2 访问非法指针

  • 空指针(未申请内存)
  • 野指针(已释放内存),野指针通常是因为指针变量中保存的值不是一个合法的内存地址而造成的。指向没有写权限的一块地址。
  • 重复释放指针(内存)
  • 指针强制转换,指针强制转换需特别谨慎,可能因为对齐、起始地址等问题引起内存访问错误

合法的内存地址:1.在堆空间动态申请的;2.局部变量所在的栈。

2.3 堆栈溢出

分配大量局部变量、多重函数调用、较深的函数递归等可能导致堆栈溢出

2.4 多线程访问

  • 调用不可重入函数
  • 共享数据未互斥访问

https://cloud.tencent.com/developer/article/1191950

 解决办法是,多线程访问共享变量时要加锁来控制。

2.5 未处理的异常

当程序中抛出未被捕获的异常时,操作系统会捕获并生成coredump。这些异常可能是由空指针解引用、数组越界、除以零等引起的。

信号处理:某些信号(如SIGSEGV、SIGABRT等)表明程序发生了严重错误,操作系统将生成coredump以便开发人员诊断问题。

栈溢出:递归调用或大规模局部变量可能导致栈溢出,这也可能引发coredump。

依赖库问题:使用的某些依赖库可能存在版本不兼容或存在Bug,导致程序崩溃并生成coredump。

文件读写问题:在文件读写操作中,错误的文件句柄、权限问题或者文件内容不符合预期可能导致程序异常并生成coredump。

多线程问题:多线程程序中的竞态条件、死锁等问题可能导致coredump。

3.开启

"ulimit -c"命令,查看是否开启,返回0表示未开启coredump记录功能。

:~$ ulimit -c;
unlimited

可以使用“ulimit -c [size]”命令指定记录coredump文件的大小,即是开启coredump记录。执行“ulimit -c unlimited”设定,设置不限定大小。

通过配置文件永久设置,在"/etc/profile"文件增加" ulimit -c unlimited "

ulimit命令:

$ ulimit -a
core file size          (blocks, -c) unlimited    //-c <core最大值>:设定core文件的最大值,单位为块(block)
data seg size           (kbytes, -d) unlimited    //-d <数据节段大小>:进程数据段最大值,单位为KB
scheduling priority             (-e) 0    //
file size               (blocks, -f) unlimited    //-f <文件大小>:进程可创建最大文件值,单位为块(block)
pending signals                 (-i) 1029615  
max locked memory       (kbytes, -l) 64     //-l <内存大小>: 可加锁内存大小,单位 为KB 
max memory size         (kbytes, -m) unlimited    //-m <内存大小>:指定可使用内存的上限,单位为KB
open files                      (-n) 1000000    //-n <文件数目>:进程最大可打开的文件数(文件描述符数目)
pipe size            (512 bytes, -p) 8    //-p <缓冲区大小>:管道缓冲区的大小,单位为KB
POSIX message queues     (bytes, -q) 819200    
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192   // -s <堆栈大小>:线程最大堆栈大小,单位为KB
cpu time               (seconds, -t) unlimited    //-t <cpu时间>:cpu最大占用时间,单位为秒
max user processes              (-u) 1029615  //-u <进程数目>:用户可创建的最大进程数
virtual memory          (kbytes, -v) unlimited    //-v <虚拟内存大小>:进程最大可用虚拟内存,单位为KB
file locks                      (-x) unlimited

 

posted @ 2022-10-29 20:45  lypbendlf  阅读(148)  评论(0编辑  收藏  举报