1:当一个程序崩溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。

当程序接收到以下UNIX信号会产生core文件:SIGABRT、SIGBUS、SIGEMT、SIGFPE、SIGILL、SIGIOT、SIGQUIT、SIGSEGV、SIGSYS、SIGTRAP、SIGXCPU、SIGXFSZ;

下面比较详细地说明这些信号。

• SIGABRT 调用abort函数时产生此信号。进程异常终止。

• SIGBUS 指示一个实现定义的硬件故障。

• SIGEMT 指示一个实现定义的硬件故障。

• SIGFPE 此信号表示一个算术运算异常,例如除以0,浮点溢出等。

• SIGILL 此信号指示进程已执行一条非法硬件指令。

• SIGIOT 这指示一个实现定义的硬件故障。

• SIGQUIT 当用户在终端上按退出键(一般采用Ctrl-\)时,产生此信号,并送至前台进程组中的所有进程。此信号不仅终止前台进程组(如SIGINT所做的那样),同时产生一个core文件。

• SIGSEGV 指示进程进行了一次无效的存储访问。

• SIGSYS 指示一个无效的系统调用。由于某种未知原因,进程执行了一条系统调用指令,但其指示系统调用类型的参数却是无效的。

• SIGTRAP 指示一个实现定义的硬件故障。

• SIGXCPU SVR4和4.3+BSD支持资源限制的概念。如果进程超过了其软CPU时间限制,则产生此信号。

• SIGXFSZ 如果进程超过了其软文件长度限制,则SVR4和4.3+BSD产生此信号。

摘自《UNIX环境高级编程》第10章 信号。

2:ulimint -a 用来显示当前shell下的各种用户进程限制

# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7422
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 512000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7422
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

core file size 的值为0,说明当前环境不会产生core文件。

使用ulimit -c,可以设置core文件的大小,从而使得程序崩溃时可以产生core文件:

# ulimit -c 1024
# ulimit -a
core file size (blocks, -c) 1024
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7367
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7367
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

上面的命令,将core文件的大小最大设置为1024,单位为blocks,blocks的具体值与环境相关,可以通过查看/proc/<pid>/limits得到core文件的具体大小:

# cat /proc/self/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 10485760 unlimited bytes
Max core file size 1048576 1048576 bytes
Max resident set unlimited unlimited bytes
Max processes 7367 7367 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 7367 7367 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

可见,core文件的最大为1048576字节,1048576/1024=1024,因此,blocks的值为1024。

可以通过ulimit -c unlimit命令,打开core文件的产生,并且不限制core文件的大小:

# ulimit -c unlimited
# ulimit -a |grep core
core file size (blocks, -c) unlimited # cat /proc/self/limits |grep core
Max core file size unlimited unlimited bytes

可以通过ulimit -c 0关闭core文件的产生:

# ulimit -c 0
# ulimit -a|grep core
core file size (blocks, -c) 0 # cat /proc/self/limits |grep core
Max core file size 0 0 bytes

3:ulimit -c 命令进行的修改只是对当前shell有效,是临时的。如果想让修改永久生效,则需要修改配置文件,如 .bash_profile、/etc/profile或/etc/security/limits.conf。

比如,可以在/etc/profile文件的末尾加上一句:

ulimit -c unlimited

4:对于后台服务而言,如果要生成core文件,还需要设置/proc/sys/kernel/core_pattern 文件的内容。该文件定义了core文件产生的路径和文件名格式,比如:

echo "/data/cores/core_%e_%p_%t" > /proc/sys/kernel/core_pattern

上面的命令将core文件的路径设置为"/data/cores",要注意该目录必须存在,而且进程具有写权限。文件名的格式设置为"core_%e_%p_%t",其中的格式化字符定义如下:

%%  a single % character
%c core file size soft resource limit of crashing process (since Linux 2.6.24)
%d dump mode—same as value returned by prctl(2) PR_GET_DUMPABLE (since Linux 3.7)
%e executable filename (without path prefix)
%E pathname of executable, with slashes ('/') replaced by exclamation marks ('!') (since Linux 3.0).
%g (numeric) real GID of dumped process
%h hostname (same as nodename returned by uname(2))
%p PID of dumped process, as seen in the PID namespace in which the process resides
%P PID of dumped process, as seen in the initial PID namespace (since Linux 3.12)
%s number of signal causing dump
%t time of dump, expressed as seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC)
%u (numeric) real UID of dumped process

因此,上面设置的core文件名格式中包含了可执行程序名、程序ID,时间戳。注意,这里的时间戳是1970之后的秒数,可以使用”date -d @XXX”命令,转换为可读时间:

# date -d @1504057088
Wed Aug 30 09:38:08 CST 2017

5:abrt

Redhat系列的系统中,其core_pattern的内容可能如下:

|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e

这是将产生的core文件传递给abrt-hook-ccpp程序,该程序是ABRT的一个组件。ABRT就是Automatic Bug Reporting Tool的缩写。通过该工具,可以更全面的查看core文件的内容。具体参考:

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/ch-abrt.html

6:调试

用GDB调试core文件的命令:

gdb  <filename>  <core> 

filename就是产生core文件的可执行文件,croe就是产生的core文件名。

使用 backtrace 或者 bt 打印当前的函数调用栈的所有信息。

如果要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。

(gdb) f/frame <n>            #  n从0开始,是栈中的编号

(gdb) up <n>                # 向栈的上面移动n层。如无n,向上移动一层

(gdb) down <n>              # 向栈的下面移动n层。如无n,向下移动一层

# 这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。

(gdb) info f/frame

(gdb) info args             # 打印当前函数的参数名及值

(gdb) info locals           # 打印当前函数中所有局部变量及值

(gdb) info catch            # 打印当前函数中的异常处理信息

如果是多线程环境,则可以使用下面的命令调试:

(gdb) info threads              # 显示当前可调试的所有线程

(gdb) thread <ID>              # 切换当前调试的线程为指定ID的线程

(gdb) thread apply all <command>        # 所有线程执行command

如果某个进程已经运行起来了,则可以使用attach命令,调试该进程。运行该命令后,该进程的运行就会停止(不是死亡),此时便可以进行设置断点,查看变量等调试操作:

(gdb) attach <process-id>        # 在gdb状态下,开始调试一个正在运行的进程

基本上上面几个命令就够了,如果需要查看其他GDB调试命令,参考GDB手册。

core文件相关的更多相关文章

  1. 如何设置、查看以及调试core文件

    http://blog.csdn.net/xiaoxiaoniaoer1/article/details/7740820 1.core文件的生成开关和大小限制--------------------- ...

  2. Linux上调试core文件(Good)

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

  3. GDB调试之core文件(如何定位到Segment fault)

    core dump又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个core文件中,叫core dump.(内部实现是:linux系统中内存越界会收到SI ...

  4. (转)Linux core 文件介绍与处理

    1. core文件的简单介绍 在一个程序崩溃时,它一般会在指定目录下生成一个core文件.core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的. 2. 开启或关闭core文件的生成用以 ...

  5. linux 程序无缘无故推出 没有core文件 broken pipe Resource temporarily unavailable

    问题 1. linux socket 服务端程序 无缘无故退出 . 2. 客户端大量访问服务端后,出现  Resource temporarily unavailable错误 问题分析: 1. 是否有 ...

  6. 006.ks.cfg文件相关

    一 图形化生成ks.cfg文件 [root@server ~]# yum -y install system-config-kickstart #安装图形化kickstart工具 [root@serv ...

  7. 普通用户su 到root,无需密码方式,及iptables封掉本机某个端口,core文件配置

    一. 普通用户su到root无需密码: 随着服务器越来越多,普通用户转到root下,去查密码表是个很繁琐的事,发现有如下方式比较方便(需要root操作) vi /etc/pam.d/su  将 aut ...

  8. mysql core文件的正确打开姿势

         最近两天自己负责的一个实例频繁出现crash的情况,分析了日志,大致明白了crash的原因,但是没有定位到具体的SQL,也没有找到很好的规避的办法,因此想在mysql出现crash的时候自动 ...

  9. linux core文件机制

    在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数. 1.core文件的生成开 ...

随机推荐

  1. 跟我一起做一个vue的小项目(APPvue2.5完结篇)

    先放一下这个完结项目的整体效果 下面跟我我一起进行下面项目的进行吧~~~ 接下来我们进行的是实现header的渐隐渐显效果,并且点击返回要回到首页 我们先看效果 在处理详情页向下移动过程中,heade ...

  2. getBoundingClientRect介绍

    getBoundingClientRect用于获取元素相对与浏览器视口的位置 由于getBoundingClientRect()已经是w3c标准,所以不用担心兼容,不过在ie下还是有所区别 { top ...

  3. 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践

    1. 概述 数据服务(https://ds-cn-shanghai.data.aliyun.com) 是DataWorks产品家族的一员,提供了快速将数据表生成API的能力,通过可视化的向导,一分钟“ ...

  4. ECMAScript 6 (浅显入门)

    1.let:ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为unde ...

  5. meta标签中设置apple-itunes-app的意义

    告诉iphone的safari浏览器:这个网站对应的是哪个app <meta name="apple-itunes-app" content="app-id=589 ...

  6. CSS--去除除文本基线的几种方式

    削除文本基线的几种方式:1.display:block2.vertical-align:middle3.font-size:0px

  7. MySQL数据库的全局锁和表锁

    1.概念 数据库锁设计的初衷是处理并发问题.作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则.而锁就是用来实现这些访问规则的重要数据结构. 2.锁的分类 根据加锁的范围, ...

  8. Spring boot随时获取ApplicationContex

    @Service public class SpringManager implements ApplicationListener<ContextRefreshedEvent> { pr ...

  9. Win7。56个进程让我头疼

    乱七八糟的进程一个一个往外蹦,如此痛苦. 安装了一个VM9,进程数量+5,安装了卖咖啡的,进程数量+5. 除去这10个,系统进程数量还有46个....还是太多... 64位系统,真的很痛苦,还没有怎么 ...

  10. javascript最大公约数与最小公倍数

    var a = 5 ; var b = 15 ; var min = Math.min(a,b); var max = Math.max(a,b); // for循环求最大公约数 for(var i ...