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 ...
随机推荐
- simplefactory简单工厂模式
简单工厂模式概述 又叫静态工厂方法模式,它定义一个具体的工厂类负责一些类的实例 优点 客户端不需要在负责对象的创建,从而明确了各个类的职责 缺点: 这个静态工厂类负责所有对象的创建, ...
- struts2自定义声明校验器
1 //新建一个validators.xml在src根资源下,会覆盖default.xml的validators,所以你懂得 //接着,若使用声明式校验,则要把配置文件xxxAction-valida ...
- 【网络】js调试F12控制台学习
http://www.cnblogs.com/52cik/p/js-console-acquaintance.html console.log 输出信息 http://javascript.ruany ...
- 2015-10-11 Sunday 晴 ARM学习
基础的知识看得差不多了,linux系统相关的,最主要是c语言基础知道,还有linux系统编程,网络编程socket等相关的.这些内容最最基础的看完了,接下来我在考虑看什么呢?是看ARM以及驱动编程系列 ...
- Javascript模块化编程(三):require.js的用法 (转)
转自:http://my.oschina.net/u/1390066/blog/213769 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载 ...
- Java条件语句之 switch
当需要对选项进行等值判断时,使用 switch 语句更加简洁明了.例如:根据考试的名次,给予前 4 名不同的奖品.第一名,奖励笔记本一台:第二名,奖励 IPAD 2 一个:第三名,奖励移动电源一个:最 ...
- PHP String函数分类
1.查找字符位置函数: strpos ($str,search,[int]): 查找search在$str中的第一次位置从int开始: stripos ($str,search,[int]): ...
- nginx中针对目录进行IP限制
一个不错的nginx中针对目录进行IP限制 ,这里我以phpmyadmin目录只能让内网IP访问,而外网不能访问的配置方法,有需要的同学可参考. nginx phpmyadmin 针对内网ip用户开放 ...
- Excel的最大行数
使用Excel2007或Excel2010,在“另存为” 菜单中可以选择为“Excel 07-2003 工作薄”,从中我们可以看出,到了2007版以后,存储格式变了,简单一点从扩展名便可以看出,一个是 ...
- npoi z
http://blog.csdn.net/fireghost57/article/details/25623143 http://www.cnblogs.com/jiagoushi/archive/2 ...