有的程序可以通过编译,但在运行时会出现Segment fault(段错误)。这通常都是指针错误引起的。但这不像编译错误一样会提示到文件一行,而是没有任何信息。一种办法是用gdb的step, 一步一步寻找。但要step一个上万行的代码让人难以想象。 我们还有更好的办法,这就是core file。

如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置:

#设置core大小为无限      ulimit -c unlimited

#设置文件大小为无限       ulimit unlimited

发生core dump之后,用gdb进行查看core文件的内容, 以定位文件中引发core dump的行:

gdb [exec file] [core file]

如: gdb ./test test.core 在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里,来定位core dump的文件->行。

另外需要注意的是,如果你的机器上跑很多的应用,你生成的core又不知道是哪个应用产生的,你可以通过下列命令进行查看:file core

几个问题:

1. 什么是Core:

在使用半导体作为内存的材料前,人类是利用线圈当作内存的材料(发明者为王安),线圈就叫作 core ,用线圈做的内存就叫作 core memory。如今 ,半导体工业澎勃发展,已经没有人用 core memory 了,不过,在许多情况下,人们还是把记忆体叫作 core 。

2. 什么是Core Dump:

我们在开发(或使用)一个程序时,最怕的就是程序莫明其妙地当掉。虽然系统没事,但我们下次仍可能遇到相同的问题。于是这时操作系统就会把程序当掉 时的内存内容 dump 出来(现在通常是写在一个叫 core 的 file 里面),让 我们或是 debugger 做为参考。这个动作就叫作 core dump。

3. Core Dump时会生成何种文件:

Core Dump时,会生成诸如 core.进程号 的文件。

4. 为何有时程序Down了,却没生成 Core文件。

Linux下,有一些设置,标明了resources available to the shell and to processes。 可以使用

#ulimit -a 来看这些设置。 (ulimit是bash built-in Command)

从这里可以看出,如果 -c是显示:core file size。如果这个值为0,则无法生成core文件。所以可以使用:#ulimit -c 1024   或者 #ulimit -c unlimited   来使能 core文件。如果程序出错时生成Core 文件,则会显示Segmentation fault (core dumped) 。

5. Core Dump的核心转储文件目录和命名规则:

/proc/sys/kernel /core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0

可通过以下命令修改此文件:

echo   "1" > /proc/sys/kernel/core_uses_pid

6. 如何使用Core文件:

在Linux下,使用:

#gdb -c core.pid program_name

就可以进入gdb模式。

输入where,就可以指出是在哪一行被Down掉,哪个function内,由谁调用等等。

(gdb) where

或者输入 bt。

(gdb) bt

7. 如何让一个正常的程序down:

#kill -s SIGSEGV pid

8. 察看Core文件输出在何处:

存放Coredump的目录即进程的当前目录,一般就是当初发出命令启动该进程时所在的目录。但如果是通过脚本启动,则脚本可能会修改当前目录,这时进程真正的当前目录就会与当初执行脚本所在目录不同。这时可以查看”/proc/<进程pid>/cwd“符号链接的目标来确定进程真正的当前目录地址。通过系统服务启动的进程也可通过这一方法查看。

proc/sys/kernel /core_pattern可以控制core文件保存位置和文件名格式。

可通过以下命令修改此文件:

echo  "/corefile/core-%e-%p-%t" >core_pattern

可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳

以下是参数列表:

%p - insert pid into filename 添加pid

%u - insert current uid into filename 添加当前uid

%g - insert current gid into filename 添加当前gid

%s - insert signal that caused the coredump into the filename 添加导致产生core的信号

%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间

%h - insert hostname where the coredump happened into filename 添加主机名

%e - insert coredumping executable name into filename 添加命令名

在Linux下要保证程序崩溃时生成 Coredump要注意这些问题:

一、要保证存放Coredump的目录存在且进程对该目录有写权限。存放Coredump 的目录即进程的当前目录,一般就是当初发出命令启动该进程时所在的目录。但如果是通过脚本启动,则脚本可能会修改当前目录,这时进程真正的当前目录就会与当初执行脚本所在目录不同。这时可以查看”/proc/进程pid>/cwd“符号链接的目标来确定进程真正的当前目录地址。通过系统服务启动的进程也可通过这一方法查看。

二、若程序调用了seteuid()/setegid()改变了进程的有效用户或组,则在默认情况下系统不会为这些进程生成Coredump。很多服务程序都会调用seteuid(),如MySQL,不论你用什么用户运行 mysqld_safe启动MySQL,mysqld进行的有效用户始终是msyql用户。如果你当初是以用户A运行了某个程序,但在ps里看到的这个程序的用户却是B的话,那么这些进程就是调用了seteuid了。为了能够让这些进程生成core dump,需要将/proc/sys/fs

/suid_dumpable 文件的内容改为1(一般默认是0)。

三、这个一般都知道,就是要设置足够大的Core文件大小限制了。程序崩溃时生成的 Core文件大小即为程序运行时占用的内存大小。但程序崩溃时的行为不可按平常时的行为来估计,比如缓冲区溢出等错误可能导致堆栈被破坏,因此经常会出现某个变量的值被修改成乱七八糟的,然后程序用这个大小去申请内存就可能导致程序比平常时多占用很多内存。因此无论程序正常运行时占用的内存多么少,要保证生成Core文件还是将大小限制设为unlimited为好。

四、异常退出就一定会生成core吗? 难道没有不生成core的异常退出?

如果不是正常退出的那就是有信号引起的程序退出,有些信号确实能引起程序退出但不生成core。

SIGHUP   终止进程   终端线路挂断

SIGINT   终止进程   中断进程

SIGQUIT   建立CORE文件终止进程,并且生成core文件

SIGILL   建立CORE文件   非法指令

SIGTRAP   建立CORE文件   跟踪自陷

SIGBUS   建立CORE文件   总线错误

SIGSEGV   建立CORE文件   段非法错误

SIGFPE   建立CORE文件   浮点异常

SIGIOT   建立CORE文件   执行I/O自陷

SIGKILL   终止进程   杀死进程

SIGPIPE   终止进程   向一个没有读进程的管道写数据

SIGALARM   终止进程   计时器到时

SIGTERM   终止进程   软件终止信号

SIGSTOP   停止进程   非终端来的停止信号

SIGTSTP   停止进程   终端来的停止信号

SIGCONT   忽略信号   继续执行一个停止的进程

SIGURG   忽略信号   I/O紧急信号

SIGIO   忽略信号   描述符上可以进行I/O

SIGCHLD   忽略信号   当子进程停止或退出时通知父进程

SIGTTOU   停止进程   后台进程写终端

SIGTTIN   停止进程   后台进程读终端

SIGXGPU   终止进程   CPU时限超时

SIGXFSZ   终止进程   文件长度过长

SIGWINCH   忽略信号   窗口大小发生变化

SIGPROF   终止进程   统计分布图用计时器到时

SIGUSR1   终止进程   用户定义信号1

SIGUSR2   终止进程   用户定义信号2

SIGVTALRM   终止进程   虚拟计时器到

把可能的信号都设置上句柄,看是那种情况。

原文链接:http://www.daifuxin.com/post%20cat_5%20user_4%202012%2002%2019%2027%2027%20/

关于Segmentation fault (core dumped)几个简单问题的整理的更多相关文章

  1. Segmentation fault (core dumped) 错误的一种解决场景

    错误类型 Segmentation fault (core dumped) 产生原因 Segmentation fault 段错误. Core Dump 核心转储(是操作系统在进程收到某些信号而终止运 ...

  2. Segmentation fault (core dumped)

    问题: 在Linux中实现快速排序时,没有加入终止条件,结果出现Segmentation fault (core dumped)这个问题,Segmentation fault (core dumped ...

  3. 关于Segmentation fault (core dumped)

    有的程序可以通过编译,但在运行时会出现Segment fault(段错误).这通常都是指针错误引起的.但这不像编译错误一样会提示到文件一行,而是没有任何信息.一种办法是用gdb的step, 一步一步寻 ...

  4. [CentOS7] Segmentation fault (core dumped),但是在主机上找不到core文件

    1.问题描述 程序执行报:Segmentation fault (core dumped),但是在主机上找不到core文件 2.如何让系统生成core file /home>ulimit -ac ...

  5. Segmentation fault(core dumped) 调试

    ReadingList: https://mytechrants.wordpress.com/2009/05/22/debugging-a-segmentation-fault-using-gdb/ ...

  6. Linux程序Segmentation fault (core dumped)

    1 问题原因 Segmentation fault (core dumped)多为内存不当操作造成.空指针.野指针的读写操作,数组越界访问,破坏常量等.对每个指针声明后进行初始化为NULL是避免这个问 ...

  7. VSCode添加某个插件后,Python 运行时出现Segmentation fault (core dumped) 解决办法

    在VSCode添加某个插件后,Debug出现Segmentation fault (core dumped) 解决方案,在当前environment下运行: conda update --all

  8. C++中简单程序出现Segmentation fault (core dumped)段错误

    段错误就是指访问的内存超出了系统所给这个程序的内存空间.一般是随意使用野指针或者数组.数组越界. ------两种简单解决方法:1.利用GDB调试,定位出错位置.(具体可查找博客详细学习)2.在可能出 ...

  9. Linux初学 - 解决chkconfig Segmentation fault(core dumped)

    yum install *chkconfig*

随机推荐

  1. Linux基本命令之逻辑测试一

    1.判断一个命令的结果使用test,其返回0,或一个整数.返回0表示true,返回整数表示错误码 2.获取上一个命令的返回结果使用$? 3.例如 我的服务器上面存在/home/www这样一个文件夹,所 ...

  2. [改善Java代码]使用构造函数协助描述枚举项

    一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性:枚举描述,它的含义是通过枚举的构造函数,声明每个枚举 ...

  3. 【约瑟夫环变形】UVa 1394 - And Then There Was One

    首先看到这题脑子里立刻跳出链表..后来继续看如家的分析说,链表法时间复杂度为O(n*k),肯定会TLE,自己才意识到果然自个儿又头脑简单了 T^T. 看如家的分析没怎么看懂,后来发现这篇自己理解起来更 ...

  4. 转:Nginx RTMP 功能研究

    看点: 1.    Nginx 配置信息与使用.  (支持 rtmp与HLS配置) 2.    有ffmpeg 编译与使用,    命令行方式来测试验证客户端使用. 转自:http://blog.cs ...

  5. HttpClient(4.3.5) - HTTP Authentication

    HttpClient provides full support for authentication schemes defined by the HTTP standard specificati ...

  6. 【转载】Apache Kafka监控之Kafka Web Console

    http://www.iteblog.com/archives/1084 Kafka Web Console是一款开源的系统,源码的地址在https://github.com/claudemamo/k ...

  7. Javascript之简单按钮搜索功能

    学习JavaScript我觉得真实的感觉就是可以任意设计,“没有做不到只有想不到!”即使简单,但是任何东西的复杂都是从简单.基础开始的!这是我自己做的一个超简单的"搜索引擎"按钮, ...

  8. Javascript之登陆验证

    匹配中文字符的正则表达式: [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff] 匹配空行的正则表达式:\n[\s| ]*\r 匹配网址URL的正则表达式:http ...

  9. JAVA生成EXCEL图表

    跟据客户的要求,需要开发一套包括图形的报表,还需要导出WORD 图表需要这样: 这样: 这样: 还有这样: 接下来是实现思路: 以往用的最多的就是JFreechart,手上也有实现各种图形的资源,但是 ...

  10. iOS开发——开发者官网注册新设备

    1.第一步登陆苹果开发者中心官网,进入证书栏后如下图:点击All 或者如果是iPhone设备直接点击iPhone也行. 然后点击右上角的[+]号