分类: LINUX
2012-08-28 20:42:25
一,什么是core文件?什么是core dump?为什么要提出这?
Gdb手册上是这么描述core文件的定义的,A core file or core dump is a file
that records the memory image of a running process and its process
status(register values etc...)。
Core文件理解:当一个进程崩溃时,在该进程会在指定目录生成一个core文件
用来记录该进程崩溃时的内存映像,并附带了一些调试信息。该文件主要供
调试使用。
(1)在软件开发中,很多bug只能在特定的环境和条件下才能出现,重现的时机
和条件都很难把握。有可能出现很多次测试后该问题才重现一次。这就给调试带
来了很多不便。
(2)还有一种情形,就是软件的代码量比较大,如果靠设断点和单步跟踪也很
麻烦,起码很费时间。
为了解决上面的两个问题,就提出了core dump技术,在程序崩溃的时候,将
程序的内存映像保存到一个core文件中去,然后通过分析这个core文件来找到程序
崩溃的原因。
----------------------------------------------------------------
二,怎么查看系统是否打开生成core文件的功能?没有开启又该如何开启?
可以使用ulimit命令查看。
#ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited
core file size (blocks, -c) 0说明core文件的最大大小为0,说明core dump
没有开启。可以使用ulimit -c unlimited来开启core dump。
---------------------------------------------------------------
三,如何设置core dump文件名及其文件位置?
/proc/sys/kernel/core_uses_pid 这个文件内容为0的话,所有core dump文件
名都是core,没有扩展名;内容为1的话,文件名编程core.pid,即加上进程号作
为扩展名。
sudo echo "1" > /proc/sys/kernel/core_uses_pid 修改该参数。
还可以通过修改/proc/sys/kernel/core_pattern来指定core dump文件位置和文件名,
此文件内容改为/tmp/coredumpfile/core-%e-%p-%t,表示所有的core dump都放在/tmp/coredumpfile目录下,文件名为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 添加主机名
四,如何使用gdb来调试core文件?
gdb [选项] 被调试的可执行文件 core文件
执行该命令,gdb会产生生成该core文件的进程名,中断该进程的信号等。
当进程接收到一下UNIX信号时会产生core文件。
SIGABRT :调用abort函数产生该信号,进程异常终止。
SIGFPE:该信号表示一个算术运算异常,例如除以0,浮点数溢出等。
...
-----------------------------------------------------------------------------
五,实例:(通过除数为0制造出core dump)
中断的原因是 Arithmetic exception
而且通过bt指令可以看到出现异常的函数是在执行wib函数时出现的。
--------------------------------------------------------------------------------
参考:
http://blog.163.com/hancker_31/blog/static/3558736120103752651164/