调试--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文件的许可权(假定该文件在此之前并不存在)通常是用户读/写,组读和其他读。
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号