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 ...
随机推荐
- Python [Leetcode 344]Reverse String
题目描述: Write a function that takes a string as input and returns the string reversed. Example:Given s ...
- Struts2 的 helloworld
配置步骤: 1.在你的strut2目录下找到例子项目,把它的 lib 下的jar拷贝到你的项目.例如我的:struts-2.3.24\apps\struts2-blank 2.struts-2.3.2 ...
- ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)
不论是单实例还是RAC,对于非缺省端口下(1521)的监听器,pmon进程不会将service/instance注册到监听器,即不会实现动态注册.与单实例相同,RAC非缺省端口的监听器也是通过设置参数 ...
- for-in遍历json数据
1.for遍历json数据 ','fun':'前端开发'} for(var attr in json){ alert(json[attr]) //遍历json属性的数据 alert(json['nam ...
- php查询汉字的拼音首字母的函数
function getfirst($str, $charset='utf8'){ $dict=array( 'a'=>0xB0C4, 'b'=& ...
- linux xampp eclipse xdebug 无法进入断点
一.xampp 版本 1.8.3-5 xampp安装后会自动集成xdebug,目录一般为 /opt/lampp/lib/php/extensions/***-debug-***目录 关于php 与ph ...
- hdu 2732 Leapin' Lizards(最大流)Mid-Central USA 2005
废话: 这道题不难,稍微构造一下图就可以套最大流的模板了.但是我还是花了好久才解决.一方面是最近确实非常没状态(托词,其实就是最近特别颓废,整天玩游戏看小说,没法静下心来学习),另一方面是不够细心,输 ...
- hibernate 建表一对一 就是一对多,多的一方外键唯一unique
Person.java package cn.itcast.hiberate.sh.domain.onetoone; import java.io.Serializable; import java. ...
- Oracle11g安装出现em.ear
在windows 7下安装Oracle 11g R2 时大概安装到45%时 提示找不到em.ear文件,如果点击继续还会出现其他错误,最后安装不成功. 检查文件发现另外一个zip没有解压 解压第二个压 ...
- Php 笔记1-----request和 response
不能大于2KB 第一次学习 php, 因为以前习惯了 .net, 所以 刚开始总是按照.net的 思路去思考, 怎么获取 客户端发过来的 request对象啊, 怎么设置response啊.. ...