Linux下core文件及使用
core文件的作用:当程序崩溃时,内核有可能把该程序当前内存映射到core文件中,方便程序员找到程序出现问题的地方,最常出现的,几乎所有C程序员都出现过的“段错误”了。也是最难查出问题原因的一个错误core文件是什么:核心文件(core file),也称为核心转存(core dump),是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。
core文件是什么
核心文件(core file),也称为核心转存(core dump),是操作系统在进程运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。
Segmentation fault (core dumped)多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。如对链表的新增和释放包括赋值等等,如出现不当操作都有可能造成程序崩溃。对每个指针声明后进行初始化为NULL是避免这个问题的好办法。排除此问题的最好办法则是调试。
core文件生成后的路径和名称
通过cat /proc/sys/kernel/core_pattern
,可以查看core文件保存的位置和文件名格式
当程序core dump后发现确实在本地目录产生了core文件,但是如果程序多次core dump时,core文件会被覆盖,原因是每次core dump后生成的文件名默认都叫core,如果想在每次core dum时产生的core文件都带上进程号怎么操作,或者你想把内核转储文件保存到其他目录怎么办?
-
使用
cat /proc/sys/kernel/core_uses_pid
,查看生成的core文件名称是否添加pid作为扩展,可以通过修改这个文件中的值为1来修改生成的core文件的名称。如果为0,说明生成的core文件就是core文件 如果为1,说明生成的core文件格式为core.xxxx;
2.通过修改kernel的参数,指定内核转储所生成的core文件的路径和文件名。
切换到root用户,执行#vim /etc/sysctl.conf
,然后在sysctl.conf文件中添加下面两句话:
kernel.core_pattern = /home/smart/corefile/core-%e-%p
kernel.core_uses_pid = 0
保存sysctl.conf文件后退出,并执行sysctl -p
即时生效。
3.在 /home/smart/目录下先建立corefile文件夹,后面如果core dump时,就会在/home/smart/corefile/下产生以指定格式命名的内核转储文件。
注意:如果/proc/sys/kernel/core_uses_pid 这个文件的内容被配置成1,即使core_pattern中没有设置%p,最后生成的core dump文件名仍会加上进程ID。
以下是参数列表:
%p-添加pid
%u-添加当前uid
%g-添加当前gid
%s-添加导致产生core的信号
%t-添加core文件生成时的unix时间
%h-添加主机名
%e-添加命令名
core文件的查看:
core文件需要使用gdb查看。
方式1:
gdb ./a.out
core-file core.xxxx(core.xxxx就是core文件名)
使用bt命令即可看到程序出错的地方
方式2:
gdb -core=core.xxxx(core.xxxx就是core文件名)
file ./a.out
bt
方式3:
gdb -c core.xxxx(core.xxxx就是core文件名)
file ./a.out
bt
方式2、3两种命令的效果相同,但是有些环境下不生效,所以推荐使用方式1
gdb -core=core.xxxx(core.xxxx就是core文件名)
file ./a.out
bt
更多推荐
所有评论(0)