欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

coredump

程序员文章站 2022-07-14 23:37:49
...

设置 core

  • ulimit -c 查看 core 文件限制,如果为 0,说明 core 开关关闭;
  • ulimit -c 1024 设置 core 为 1024 个 block(一般 1 block = 512 bytes,也可以 ulimit -a 查看);ulimit -c unlimited 设置当前的 core 为无限制。
  • 或者设置为永久生效,方式是:修改 /etc/security/limits.conf 文件,在下面加上 * soft core unlimited,然后重新登录(sudo su admin 之后再 sudo su <yourusername>);
  • cat /proc/sys/kernel/core_pattern 查看默认的 core 文件存储位置及 core 文件名格式;
    coredump
  • 修改上述 pattern 文件,即可修改 core 的存储位置及名称格式。
%h %e %p %t %u %g %s
产生 core 的主机名 程序文件名 pid 时间戳 uid gid 产生 core 的信号

gdb 调试 core:

  • 我使用的示例代码;
#include <stdio.h>
int main()
{
    int *p = NULL;
    *p = 666;
    return 0;
}

  • 编译时加上 -g 选项:gcc -g main.c -o main
  • 运行时出 core;
  • gdb <程序名> <core名>gdb ./main /home/admin/core/core-HOST-main-70197-1577277341 进入调试;
  • gdb -c /home/admin/core/core-HOST-main-70197-1577277341,进入调试界面后再用 file ./main 关联到程序文件;
  • wherebt 查看 core 在程序中发生的位置。
    coredump

core 的可能产生原因

可以使用 kill -l 查看所有信号
coredump

信号 错误名称 发生原因 解决方案
SIGQUIT
(3)
程序退出(如程序运行中按下 ctrl+\
SIGILL
(4)
illegal instruction
(非法指令)
进程中的某一句不能被 CPU 识别成正确的指令,发生的可能原因如:
1) 硬盘故障导致数据出错;
2) 由于指令集的演进导致在新体系结构中编译的可执行程序在老机器上运行时会出现 SIGILL;
3) 工具链(编译器、汇编器、链接器)出现问题;
4) 在某一系统环境中编译得到的可执行文件运行在另一系统环境下
SIGTRAP
(5)
跟踪自陷
SIGBUS
(7)
bus error
(总线错误)
(非法地址、违反定位访问)企图在奇数地址起始的地方强制类型转换为 short、int 等类型的值(在 Intel 处理器上不会有问题,但是效率会降低) 使用内存拷贝的方式
SIGSEGV
(11)
segmentation fault
(段错误)
非法访问,访问了不该访问的内存,发生的可能原因如:
1) 向空指针处赋值;
2) 数组越界;
3) 将 int 型值赋给 %s 格式的字符串;
4) 磁盘空间不足(可以使用 df -lh 查看磁盘使用情况,-h 的目的是将 size 转换为更容易理解的形式如 GB、MB、kB)
SIGFPE
(8)
浮点异常 算术错误,如除零
SIGIO
  • bus error
#include <stdio.h>

int main()
{
    char buf[256];
    int* x;
    x = (int*) &(buf[1]);
    *x = 666;
    printf("*x = %d\n", *x);
    return 0;
}