linux core dump 生成和调试
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 生成和调试的更多相关文章
- 【转】 Linux Core Dump 介绍
=============================================================== Linux core dump的祥细介绍和使用 =========== ...
- Linux core dump file详解
Linux core dump file详解 http://www.cnblogs.com/langqi250/archive/2013/03/05/2944931.html
- 在Linux上利用core dump和GDB调试
段错误(segfault) "段错误"是程序试图操作不允许访问或试图访问的不允许内存的情况.可能导致段错误的原因主要有: 1.试图解引用空指针(你不允许访问内存地址0) 2.试图解 ...
- 在Linux上利用core dump和GDB调试segfault
时常会遇到段错误(segfault),调试非常费劲,除了单元测试和基本测试外,有些时候是在在线环境下,没有基本开发和测试工具,这就需要调试的技能.以前介绍过使用strace进行系统调试和追踪<l ...
- CORE DUMP生成调试
之前我调试嵌入式linux程序,一般是借助ucontext库,在发生段错误时,直接将错误函数打印出来.有同事建议我使用core dump,于是我今天在嵌入式板卡尝试了core文件的生成,但是也是几经波 ...
- Linux Core Dump
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”).我们可以认为 core dump 是“内存快 ...
- linux core dump 文件 gdb分析
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIG ...
- Segment fault及LINUX core dump详解
源自:http://andyniu.iteye.com/blog/1965571 core dump的概念: A core dump is the recorded state of the work ...
- Linux Core Dump【转】
转自:http://www.cnblogs.com/hazir/p/linxu_core_dump.html 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中 ...
随机推荐
- macbook pro上安装vmware虚拟机
http://xclient.info/s/vmware-fusion.html?_=84739015bcde24a4cc7a744d2d5f748b https://docs.vmware.com/ ...
- Git客户端使用教程
课程地址 <版本控制入门 – 搬进 Github> 笔记参考 <搬进 Github> Git客户端的使用 Git for windows下载 新建一个仓库tata,使用subl ...
- DP + 概率 + 贪心 UVA 1456 Cellular Network
题目传送门 题意:(摘自LRJ<训练指南>) 手机在蜂窝网络中的定位是一个基本问题.假设蜂窝网络已经得知手机处于c1, c2,…,cn这些区域中的一个,最简单的方法是同时在这些区域中寻找手 ...
- 对char类型数组的英文字母进行冒泡排序
import java.util.Arrays; import java.util.Scanner; public class Demo02 { public static void main(Str ...
- Java几种常见的排序方法
日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一 ...
- 关于k阶裴波那契序列的两种解法
在学校的anyview的时候,遇到了这个题: [题目]已知k阶裴波那契序列的定义为f(0)=0, f(1)=0, ..., f(k-2)=0, f(k-1)=1;f(n)=f(n-1)+f(n-2)+ ...
- java.lang.String 字符串操作
1.获取文件名 //获取文件名,即就是去掉文件的后缀 /** * mypic.jpg * 获取文件名 * 1. 先找到"."的位置 * 2. 从第一个字符开始截取到".& ...
- 忘记dba用户密码,利用SQLPlus重置dba密码
打开SQL Plus 输入用户名: sys as sysdba 输入口令:可直接回车 连接到: Oracle Database 11g Enterprise Edition Release 11.2. ...
- Sql Server 2012 事务复制遇到的问题及解决方式
1.订阅服务器提示:作业失败.无法确定所有者 WIN-01Q6JB46CHV\Administrator(拥有作业XXX)是否有服务器访问权限(原因:无法获取有关 Windows NT 组/用户'WI ...
- uoj #15. 【NOIP2014】生活大爆炸版石头剪刀布
石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第 8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的石头剪 ...