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

最新文章

  1. 0.HBase In Action(HBase实战,翻译)
  2. 接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)?
  3. 关于Filter的配置
  4. Android 使用意图传递数据
  5. C语言 百人拉百灯问题
  6. QListWidget的QComboBox下拉列表添加复选框及消息处理
  7. 用HTML 格式导出Excel
  8. Randoop测试类和方法(用例自动生成)
  9. 小强的HTML5移动开发之路(12)——从一个多媒体标签说起
  10. Android Gradle使用总结
  11. Practice2 结对子之“小学四则运算”
  12. 结合MongoDB开发LBS应用(转)
  13. hadoop的输入和输出文件
  14. ansible实现keepalived和nginx高可用
  15. delphi Int64Rec 应用实例
  16. php 流程控制switch实例
  17. #001 如何组织JS代码
  18. 30-python3 中 bytes 和 string 之间的互相转换
  19. ESS控制台发布新功能:创建多实例规格的伸缩配置
  20. UVA 548(二叉树重建与遍历)

热门文章

  1. bzoj 4568: [Scoi2016]幸运数字【树链剖分+线段树+线性基】
  2. 极简版OKEX比特币跨期对冲策略
  3. springboot(十)SpringBoot消息中间件RabbitMQ
  4. 关于新手html的认识 以及对table的基本用法
  5. 【react-native】持续踩坑总结
  6. TIME-April
  7. 人工智能-深度学习(2)TensorFlow安装及基本使用(学习笔记)
  8. 一步一步学习GTK
  9. ACM_素数环(dfs)
  10. Errors running builder 'JavaScript Validator'错误处理