Linux coredump
前面写过通过注册信号处理函数定位SEGV问题。其实Linux coredump机制也是比较好的debug手段。
进程由于某种异常或者bug导致在运行过程中异常退出或者中止,有时会产生一个叫做core的文件。在此文件中包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息。
core文件一般在以下几种情况下产生:
1,内存访问越界
a) 由于使用错误的下标,导致数组访问越界。
b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。
c) 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。
2,多线程程序使用了线程不安全的函数。
3,多线程读写的数据未加锁保护。对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成coredump
4,非法指针
a) 使用空指针
b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump。
5,堆栈溢出
不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。
默认情况下一般系统不会产生core文件。
如果ulimit -c的结果为0,不会产生core文件。可以用ulimit -c filesize,filesize 是生成文件的大小,以blocks为单位,1个block为512bytes。可以将其设置unlimited(ulimit -c unlimited)那么core文件大小不受限制。可以将命令加到/etc/profile中。也可以在程序中用setrlimit函数来设置。
我们还可以设置core文件的生成路径。
通过echo /mnt/hgfs/share/test/core.%e.%p > /proc/sys/kernel/core_pattern
生成的core文件名字为“core.程序文件名.进程ID”
可以在代码中打开core_pattern文件,将路径名字写到文件中,也可以将修改路径的命令加到rc.local中。
下面以一个简单的sample来演示怎么用core文件定位问题。
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <fcntl.h>
void func()
{
printf("func!\n");
int *p = NULL;
*p = 8;
printf("func! %d\n",*p);
}
int main(void)
{
const char *path = "/mnt/hgfs/share/test/core.%e.%p";
int fd = open("/proc/sys/kernel/core_pattern", O_WRONLY);
if (fd < 0)
{
printf("open fail, errno:%d, %s\n", errno, strerror(errno));
return -1;
}
write(fd, path, strlen(path));
close(fd);
#if 1
struct rlimit rl = {RLIM_INFINITY, RLIM_INFINITY};
if (0 != setrlimit(RLIMIT_CORE, &rl))
{
printf("setrlimit fail, errno:%d, %s\n", errno, strerror(errno));
return -1;
}
#endif
func();
return 0;
}
gcc -g coredump.c -o coredump
运行程序后在指定的路径下生成了core文件。
成功将路径写到/proc/sys/kernel/core_pattern

我们可以看到core文件其实也是一种ELF格式。

通过gdb来查看core文件。可以看出在coredump.c的第13行发生了SEGV

Linux coredump的更多相关文章
- 转:linux coredump调试
1 )如何生成 coredump 文件 ? 登陆 LINUX 服务器,任意位置键入 echo "ulimit -c 1024" >> /etc/profile 退出 L ...
- Linux coredump学习笔记
初学者笔记:linux的程序在发生异常情况下,会导致进程down,多数服务器会设置生成core文件,本人在实际运营过程中发生过进程不断core,被自动监控拉起,过段时间有core的情况,进而导致磁盘被 ...
- Linux coredump解决流程
一.打开core文件限制 a.sudo vi /etc/profile b.文件末尾添加ulimit -c unlimited source /etc/profile 把文件重新加载到内存 c.roo ...
- linux coredump测试
1 )如何生成 coredump 文件 ? 登陆 LINUX 服务器,任意位置键入 echo "ulimit -c 1024" >> /etc/profile 退出 L ...
- linux coredump开启
1. ulimit -c unlimited //不限制core文件的大小 2. echo '/tmp/core.%e.%p.%t' > /proc/sys/kernel/core_patt ...
- Linux coredump 的打开和关闭
(转载自 http://blog.sina.com.cn/s/blog_6b3765230100lazj.html) ulimit -c 输出如果为0,则说明coredump没有打开 ulimit - ...
- coredump
COREDUMP调试的使用 一,什么是coredump 跑程序的时候经常碰到SIGNAL 或者 call trace的问题,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程 ...
- coredump调试的使用
一,什么是coredump 跑程序的时候经常碰到SIGNAL 或者 call trace的问题,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满 ...
- Segment fault及LINUX core dump详解
源自:http://andyniu.iteye.com/blog/1965571 core dump的概念: A core dump is the recorded state of the work ...
随机推荐
- hdu 1885 Key Task(bfs+位运算)
题意:矩阵中'#'表示墙,'.'表示通路,要求从起点'*'到达终点'X',途中可能遇到一些门(大写字母),要想经过,必须有对应的钥匙(小写字母).问能否完成,若能,花费的时间是多少. 分析:同hdu ...
- HDU 5269 ZYB loves Xor I (二分法)
题意: 给出一个序列,对每两个数求异或结果后取最低位的1出来作为一个数,然后求这些数字的和.比如:{a,b,c},结果是lowbit(a^b)+lowbit(a^c)+lowbit(b^a)+lowb ...
- mysql应用存储过程批量插入数据
--批量插入数据的sql语句 delimiter $$ DROP PROCEDURE IF EXISTS `test.sp_insert_batch` $$ CREATE DEFINER =`root ...
- 并行编译 Xoreax IncrediBuild
好东西... http://pan.baidu.com/s/1BtZ4s
- 【英语】Bingo口语笔记(15) - Give系列
- AIX 第2章 指令记录
root@db:/#mount node mounted mounted over vfs date options ------- ...
- Java核心技术II读书笔记(二)
ch2 XML 有两种XML文档结构,DTD和Schema,用解释文档构成规则,这些规则指定了每个元素俺的合法子元素和属性. DTD DTD有多种提供方式,可以像下面这样加到XML中: <?xm ...
- 有趣的js题目
([]).length ({}).length // undefined ([] + {}).length ({} + {}).length 具体解释见此.
- Swift语法
Swift语法 标签(空格分隔): Swift 1.打印输出语句 println("Hello, Swift!") 注意每行代码后面无需添加分号作为结束 2.简单值 let---常 ...
- ylb:exists(存在)的应用实例
ylbtech-SQL Server:exists(存在)的应用实例 SQL Server exists(存在)的应用实例. 1,exists(存在)的应用实例 返回顶部 -- =========== ...