1.什么是core dump?
-
问题:
程序运行时出现段错误。
一般由指针错误引起,但是却不会提示文件的某一行,使我们调试很困难。 -
gdb的一种尝试:
step一步一步找。一万行的代码,呵呵 -
core方案
让系统在信号中断造成错误的时候产生core文件 ——
$ ulimit -c unlimited
当运行时信号引起错误时发生core dump;
发生core dump后,用gdb进行查看core文件的内容,就可以定位文件中引发core dump的行了 ——
$ # gdb [exec file] [core file]
$ gdb ./test test.core
进入gdb后,可以用bt来检查程序运行到哪里。
-
这里的core是记忆体的意思,之前的内存就是core(线圈)来制作的。
-
关于core dump的意义:
操作系统将程序挂掉时的内存内容dump(抛)出来,写在core的文件中,方便我们gdb定位,这个动作就是core dump。
2.如何使用core dump?
- core dump的文件命名规则:
/proc/sys/kernel/core_uses_pid可以控制产生的core文件名中是否添加pid作为拓展,如果添加则文件内容为1。
这个目录下的另外两个含有core的文件:core_pattern、core_pipe_limit
core_pattern可以控制文件保存的位置和文件名格式
$ cat /proc/sys/kernel/core_pattern
$ core
$ echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
系统对core文件的命名均为core,存储路径在进程的当前目录下
设置的core文件命名规则为"core-命令名-pid-时间戳",存储路径为/corefile文件夹下
一些用到的参数列表含义:
%p pid
%u uid
%g gid
%s 到时core文件产生的信号
%t core文件生成时的unix时间
%h 主机名
%e 命令名
- 利用gdb+core恢复当掉的现场
$ gdb -c core.pid program_name
... # 使用where就可以指出哪一行被down掉,哪个函数内,由谁调用等等
(gdb) where/bt
- 关于core文件的设置:
这个是用户资源限制命令
$ ulimit [-acdfHlmnpsStvw] [size]
ulimit (bash build-in command)
-a 显示所有设置
-c core 文件的最大大小
-s 栈的大小
还有一些现在还没有用到
-H 设置硬件资源限制.
-S 设置软件资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes
- 查看core文件输出在哪里
存放core dump的目录是进程当前目录,
一般就是当初发出命令启动进程时所在的目录。
但如果是通过脚本启动,则脚本可能会修改当前目录,这时可以查看/proc/<进程pid>/cwd符号链接的目标来确定进程真正的当前目录。
系统生成的core文件不带其他任何拓展名称,全部为core。新的文件会覆盖原来的文件。
希望关于core dump的一些总结能帮到你。