调试--core

一. 何时产生core.

当程序接收到以下UNIX信号会产生core文件:


名字


说明


ANSI C  POSIX.1


SVR4  4.3+BSD


缺省动作


SIGABRT


异常终止(abort)


.       .


.      .


终止w/core


SIGBUS


硬件故障


.


.      .


终止w/core


SIGEMT


硬件故障


.      .


终止w/core


SIGFPE


算术异常


.       .


.      .


终止w/core


SIGILL


非法硬件指令


.       .


.      .


终止w/core


SIGIOT


硬件故障


.      .


终止w/core


SIGQUIT


终端退出符


.


.      .


终止w/core


SIGSEGV


无效存储访问


.       .


.      .


终止w/core


SIGSYS


无效系统调用


.      .


终止w/core


SIGTRAP


硬件故障


.      .


终止w/core


SIGXCPU


超过CPU限制(setrlimit)


.      .


终止w/core


SIGXFSZ


超过文件长度限制(setrlimit)


.      .


终止w/core

补充:

kill  -l

信号 值 处理动作 发出信号的原因 
---------------------------------------------------------------------- 
SIGHUP 1 A 终端挂起或者控制进程终止 
SIGINT 2 A 键盘中断(如break键被按下) 
SIGQUIT 3 C 键盘的退出键被按下 
SIGILL 4 C 非法指令 
SIGABRT 6 C 由abort(3)发出的退出指令 
SIGFPE 8 C 浮点异常 
SIGKILL 9 AEF Kill信号 
SIGSEGV 11 C 无效的内存引用 
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道 
SIGALRM 14 A 由alarm(2)发出的信号 
SIGTERM 15 A 终止信号 
SIGUSR1 30,10,16 A 用户自定义信号1 
SIGUSR2 31,12,17 A 用户自定义信号2 
SIGCHLD 20,17,18 B 子进程结束信号 
SIGCONT 19,18,25 进程继续(曾被停止的进程) 
SIGSTOP 17,19,23 DEF 终止进程 
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键 
SIGTTIN 21,21,26 D 后台进程企图从控制终端读 
SIGTTOU 22,22,27 D 后台进程企图从控制终端写

二. 如何打开core.

注意:和shell相关!

1)使用ulimit -c命令可查看core文件的生成开关

若结果为0,则表示关闭了此功能,不会生成core文件。
 2)使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。

若ulimit -c unlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。

 如用  ulimit -c 1024   打开core, core文件大小1024k.

三. core文件位置.

用cat /proc/sys/kernel/core_pattern查看core文件位置和命名方式.

core文件生成路径:
输入可执行文件运行命令的同一路径下。
若系统生成的core文件不带其它任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。

1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid

2)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

四. core调试.

core文件和二进制文件在同一目录下, (不在同一目录下, 写绝对路径)
(1) gdb ./a.out                               [gdb <二进制文件>]
(2) core-file core.xxxx                    [core-file  <core文件>]
(3) bt       可看到程序出错的地方。      [bt]

或者

(1) gdb   二进制    core文件

(2) bt

以下两种命令方式具有相同的效果,但是在有些环境下不生效,所以推荐使用上面的命令。 
1)gdb -core=core.xxxx
file ./a.out
bt 
2)gdb -c core.xxxx
file ./a.out
bt

%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 添加命令名

五.什么时候不产生core文件

在下列条件下不产生core文件:
( a )进程是设置-用户-ID,而且当前用户并非程序文件的所有者;
( b )进程是设置-组-ID,而且当前用户并非该程序文件的组所有者;
( c )用户没有写当前工作目录的许可权;
( d )文件太大。core文件的许可权(假定该文件在此之前并不存在)通常是用户读/写,组读和其他读。

时间: 2024-10-03 14:55:48

调试--core的相关文章

linux下如何产生core,调试core

linux下如何产生core,调试core 摘自:http://blog.163.com/[email protected]/blog/static/19554784201131791239753/ 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数. 1.core文件的生成开关和大小限制 1)使用ulimit -c命令可查看core文件的生成开关.若结果为0,则表示关闭了此

gdb调试core文件

什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core

[笔记]用gdb调试core dump

总是隔一段时间才写一次C++,有些东西老是用完就忘了……记一下如何用gdb来调试core dump免得到时候又忘记. 首先需要设置core file的大小,默认是0所以不设不会生成core file $ ulimit -c unlimited 然后在编译的flag里加上 -g -rdynamic 把动态静态符号表都弄过来 然后 $ make $ # 干点啥让它core dump 假设可执行文件叫test,生成的core file叫core(ubuntu 12.04是的,其他系统可能叫其他名字)

GDB调试core dump文件示例

上篇论述了三层的基本概念,作用,关系,现在展示下系统中用户登陆过程中简单应用三层结构设计思想. vb.NET的操作如下 首先建立以下windows应用程序以及类库 首先建立实体类 Public Class userInfo Private _username As String Public Property UserName As String Get Return _username End Get Set(ByVal value As String) _username = value E

Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件

交叉编译gdb和gdbserver 1.下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本.当然,凡事无绝对.我们以gdb-7.2.tar.bz2 这个文件为例.2.解压缩: $ tar jxvf gdb-7.2.tar.bz2 注:小技巧:Linux下一般压缩文件后缀为.tar.bz2和.tar.gz,它们解压命令有两三个选项是一致的: xf(v),前者再加上j选项,后者再加上z选项. 3.进入该目录 $ cd g

解决gdb 调试 core 文件函数名显示为问号的问题

关于gdb调试core文件总是一堆问号的问题 问题描述:已经在编译选项中加入了-g,但是查看core文件时,还是一堆问号,使用的命令为:gdb -c core 解决方案:由于gdb -c core这样的使用在有些系统下支持不是很好,所以推荐用如下两种方法: 1) gdb exe (gdb) core-file core 2) gdb -c core (gdb) file exe

linux 同步时间 调试core内核

1.同步时间 #chkconfig --list | grep ntp ntpd 0:off 1:off 2:off 3:off 4:off 5:off 6:offntpdate 0:off 1:off 2:off 3:off 4:off 5:off 6:off #chkconfig ntpdate on // 自启动. #service ntpdate start // 开启此服务 #date // 此时时间即已更新 方法2: ntpdate time.nist.gov 2.调试core信息

用gdb调试core dump文件

gdb基本的使用方法在此就不说了. 载入core文件的命令行为: dgb exe core 例如 gdb ./testall ./core.2345 最重要的一个命令是where,这个就像windbg的命令 !analyze -v 我模拟了几个crash的情况,一个一个说. 第一个:删除两次指针导致crash的情况 源程序 char *a = new char[2]; delete []a; delete []a; 运行时 *** glibc detected *** ./testall: do

gd调试命令,gdb调试core文件

使用 gcc -g test.c -o test.out 编译程序,只有加-g参数才支持gdb调试: 然后 gdb ./test.out 运行可执行文件,进入gdb调试模式(gdb),在括号后面的输入命令: (gdb)help:查看命令帮助 (gdb)start:单行执行 (gdb)l:查看源程序 (gdb)n:执行下一行 (gdb)s:进入被调函数里面 (gdb)bt:查看函数调用栈 (gdb)p 变量:打印变量值 (gdb)f:切换函数栈帧 (gdb)run:重新开始运行文件 (gdb)fi