core dump

某些信号的产生会导致产生core dump,包含了进程终止时的内存镜像。在某些时候这个core文件就非常的有用处,配合gdb或者lldb调试起来非常方便。

更详细的文档参考 Linux Manual Page http://man7.org/linux/man-pages/man5/core.5.html.

生成 core 文件

这里只讲生成的方法,不能生成core的情况参考文档

ulimit -c -H 为查看core资源的命令 -c 为软资源限制(操作系统分配),-H 为操作系统资源的上限。

  • 命令ulimit -c LIMIT, LIMIT为设置的core文件的大小,也可以设置为unlimited,当退出当前tty后设置便失效,资源限制成 0
  • 修改 /etc/profile,增加ulimit -c LIMIT,同上
  • 修改 /etc/security/limits.conf, 将 core 对应的 value 修改为要设置的值
  • 调用函数 setrlimit()设置当前进程的软core资源限制
	struct rlimit rlim;
rlim.rlim_cur = 1024 * 1024;
// rlim.rlim_max 不设置
setrlimit(RLIMIT_CORE, &rlim);

调试

1 // File:       lim.c
2 // Author: xianhui (definezxh@163.com)
3 // Date: 2018/09/10 15:24:07
4
5 #include <sys/resource.h>
6 #include <unistd.h>
7 #include <stdio.h>
8 #include <limits.h>
9
10 int main()
11 {
12 struct rlimit rlim;
13
14 getrlimit(RLIMIT_CORE, &rlim);
15 printf("cur: %lu, max: %lu\n", rlim.rlim_cur, rlim.rlim_max);
16
17 rlim.rlim_cur = 1024 * 1024;
18 // rlim.rlim_max 不设置
19
20 setrlimit(RLIMIT_CORE, &rlim);
21
22 getrlimit(RLIMIT_CORE, &rlim);
23 printf("cur: %lu, max: %lu\n", rlim.rlim_cur, rlim.rlim_max);
24
25 int *ptr = NULL;
26 for (int i = 0; i < 20; i++)
27 if (i == 10)
28 *ptr = 12;
29 } // 显然在第28行是错误的,这个用肉眼也能看的出来,但是如果是一个比较大的程序,就只顾首不顾尾了,有这个文件在,配合lldb lldb a.out --core core_p20828_s11_t1536568024
·
·
·
Process 21168 stopped
* thread #1: tid = 21168, 0x0000000000400679 a.out`main + 169 at lim.c:28,name = 'a.out', stop reason = signal SIGSEGV: invalid address (faultaddress: 0x0)
frame #0: 0x0000000000400679 a.out`main + 169 at lim.c:28
25 int *ptr = NULL;
26 for (int i = 0; i < 20; i++)
27 if (i == 10)
-> 28 *ptr = 12;
29 } // 直接定位到段错误的地方,这个刻意 i == 10 的时候才出的错,是为了监视i的值
(lldb) p i
(int) $0 = 10 // 监视段错误的时候 rlim.cur 的值
(lldb) p rlim.rlim_cur
(rlim_t) $1 = 1048576

具体的core文件生成限制,core文件名的显示,控制将哪些映射写入核心转储 等说明参考manual page。

其实说白了,就是一个内核分配生成core文件大小和将内存映像写入至那个文件中的操作。

刚开始这个core始终不能生成,是应为我抄了manual page中的那个示例,但是示例产生文件目录名和我当时的目录不一致,这就导致了core不能生成。

当前我的/proc/sys/kernel/core_pattern文件内容为 core_p%p_s%s_t%t,产生的文件为core_p20828_s11_t1536568024

linux core dump 生成和调试的更多相关文章

  1. 【转】 Linux Core Dump 介绍

    ===============================================================  Linux core dump的祥细介绍和使用 =========== ...

  2. Linux core dump file详解

    Linux core dump file详解 http://www.cnblogs.com/langqi250/archive/2013/03/05/2944931.html

  3. 在Linux上利用core dump和GDB调试

    段错误(segfault) "段错误"是程序试图操作不允许访问或试图访问的不允许内存的情况.可能导致段错误的原因主要有: 1.试图解引用空指针(你不允许访问内存地址0) 2.试图解 ...

  4. 在Linux上利用core dump和GDB调试segfault

    时常会遇到段错误(segfault),调试非常费劲,除了单元测试和基本测试外,有些时候是在在线环境下,没有基本开发和测试工具,这就需要调试的技能.以前介绍过使用strace进行系统调试和追踪<l ...

  5. CORE DUMP生成调试

    之前我调试嵌入式linux程序,一般是借助ucontext库,在发生段错误时,直接将错误函数打印出来.有同事建议我使用core dump,于是我今天在嵌入式板卡尝试了core文件的生成,但是也是几经波 ...

  6. Linux Core Dump

    当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”).我们可以认为 core dump 是“内存快 ...

  7. linux core dump 文件 gdb分析

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

  8. Segment fault及LINUX core dump详解

    源自:http://andyniu.iteye.com/blog/1965571 core dump的概念: A core dump is the recorded state of the work ...

  9. Linux Core Dump【转】

    转自:http://www.cnblogs.com/hazir/p/linxu_core_dump.html 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中 ...

随机推荐

  1. bzoj 4080: [Wf2014]Sensor Network【瞎搞+随机化】

    参考:https://blog.csdn.net/YihAN_Z/article/details/73380387 一点都不想写正解.jpg random_shuffle一下然后贪心的加点,和ans取 ...

  2. bzoj 4555: [Tjoi2016&Heoi2016]求和【NTT】

    暴力推式子推诚卷积形式,但是看好多blog说多项式求逆不知道是啥.. \[ \sum_{i=0}^{n}\sum_{j=0}^{n}S(i,j)*2^j*j! \] \[ S(i,j)=\frac{1 ...

  3. P4949 最短距离(树链剖分+树状数组+基环树)

    传送门 一个中午啊-- 本来打算用仙人掌搞的,后来发现直接基环树就可以了,把多出来的那条边单独记录为\((dx,dy,dw)\),剩下的树剖 然后最短路径要么直接树上跑,要么经过多出来的边,分别讨论就 ...

  4. 微信小程序中如何使用setData --- 修改数组对象、修改对象

    看代码吧~ 这是修改对象 this.setData({ allStageIndex: e.detail.value, [`projectDetailsData.stage`]: this.data.a ...

  5. Phpstorm安装和优化

    Phpstorm是php开发一个强大的IDE,但是它不是免费的需要注册码,而且界面是英文界面,对英文不太好的人有点不友好.所以这篇文章主要从phpstorm的破解和汉化来优化phpstorm. 1.首 ...

  6. quickpow || 快速幂

    洛谷例题 推荐自行脑补:百度百科 如果  ,那么 : 前言:快速幂就是快速算底数的n次幂.其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高. 拿题目样例 Input :2 1 ...

  7. Boost1.6x+win7+VC2015编译

    下载 通过boost官方网站, 或直接在source forge下载boost_1_6x_0. 可选包 Zlib library, 环境变量: ZLIB_SOURCE bzip2, 环境变量: BZI ...

  8. DEV—【GridControl添加按钮列】

    效果图 打开GridControl的Run Designer在左侧栏中找到: 添加一个ButtonEdit: 更改属性中的值:Caption为按钮上显示的Text:Kind为按钮的类型: 然后拖到最后 ...

  9. ssm基础配置

    1.导包 <dependencies> <dependency> <groupId>org.springframework</groupId> < ...

  10. 用yunio网盘搭建git私有仓库

      研究生开始奔波于教研室和寝室之间,于是想搭建一个git私有仓库来管理自己在做的项目或者学习资料.一来可以很方便的管理项目,二来可以学习使用git.我的主要工作平台是Linux,这也是我选择yuni ...