core文件相关
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文件相关的更多相关文章
- 如何设置、查看以及调试core文件
http://blog.csdn.net/xiaoxiaoniaoer1/article/details/7740820 1.core文件的生成开关和大小限制--------------------- ...
- Linux上调试core文件(Good)
coredump文件 什么是coredump? 通常情况下coredmp包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等.可以理解为把程序工作的当前状态存储成一个文件.许多程序和操作系统出 ...
- GDB调试之core文件(如何定位到Segment fault)
core dump又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个core文件中,叫core dump.(内部实现是:linux系统中内存越界会收到SI ...
- (转)Linux core 文件介绍与处理
1. core文件的简单介绍 在一个程序崩溃时,它一般会在指定目录下生成一个core文件.core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的. 2. 开启或关闭core文件的生成用以 ...
- linux 程序无缘无故推出 没有core文件 broken pipe Resource temporarily unavailable
问题 1. linux socket 服务端程序 无缘无故退出 . 2. 客户端大量访问服务端后,出现 Resource temporarily unavailable错误 问题分析: 1. 是否有 ...
- 006.ks.cfg文件相关
一 图形化生成ks.cfg文件 [root@server ~]# yum -y install system-config-kickstart #安装图形化kickstart工具 [root@serv ...
- 普通用户su 到root,无需密码方式,及iptables封掉本机某个端口,core文件配置
一. 普通用户su到root无需密码: 随着服务器越来越多,普通用户转到root下,去查密码表是个很繁琐的事,发现有如下方式比较方便(需要root操作) vi /etc/pam.d/su 将 aut ...
- mysql core文件的正确打开姿势
最近两天自己负责的一个实例频繁出现crash的情况,分析了日志,大致明白了crash的原因,但是没有定位到具体的SQL,也没有找到很好的规避的办法,因此想在mysql出现crash的时候自动 ...
- linux core文件机制
在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数. 1.core文件的生成开 ...
随机推荐
- Leetcode103. Binary Tree Zigzag Level Order Traversal二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / ...
- IntersectionObserver API 使用教程(转载)
作者: 阮一峰 日期: 2016年11月 3日 网页开发时,常常需要了解某个元素是否进入了"视口"(viewport),即用户能不能看到它. 上图的绿色方块不断滚动,顶部会提示它的 ...
- 告别诊断烦恼 | 应用实时监控 ARMS 上线智能和实时诊断功能
为什么要做这个功能? 作为一款应用性能监控产品,我们通常会给用户展示两类数据: 第一种是统计数据:用户通过使用统计数据设置报警(比如应用响应时间大于2s),缩小问题范围(比如报警时间范围内,是哪一个接 ...
- TZ_06_SpringMVC的入门程序
SpringMVC的入门程序 1. 创建WEB工程,引入开发的jar包 1. 具体的坐标如下 2. 配置核心的控制器(配置DispatcherServlet) 1. 在web.xml配置文件中核心控制 ...
- CodeChef--EQUAKE
题目链接 Earthquake in Bytetown! Situation is getting out of control! All buildings in Bytetown stand on ...
- Python之路,Day3- Python基础(转载Alex)
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- 洛谷P1470 最长前缀
P1470 最长前缀 Longest Prefix 题目描述 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 ...
- Leetcode575.Distribute Candies分糖果
给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果.你需要把这些糖果平均分给一个弟弟和一个妹妹.返回妹妹可以获得的最大糖果的种类数. 示例 1: 输入: candies ...
- 高可用服务 AHAS 在消息队列 MQ 削峰填谷场景下的应用
在消息队列中,当消费者去消费消息的时候,无论是通过 pull 的方式还是 push 的方式,都可能会出现大批量的消息突刺.如果此时要处理所有消息,很可能会导致系统负载过高,影响稳定性.但其实可能后面几 ...
- web前端学习(四)JavaScript学习笔记部分(3)-- JavaScript函数+异常处理+事件处理
1.Javascript函数-了解函数的用途 1.1.函数: 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块 2.Javascript函数-定义函数 2.1.function必须小写 3. ...