core dump
基本概念
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这个行为叫做core dump。实际上,除了内存信息之外,还有些关键的程序运行状态也会同时dump
下来,例如寄存器信息,内存管理信息,其他处理器和操作系统状态信息等等。
基本操作
- 终端中输入命令
ulimit -c
,输出结果为0,默认是关闭core dump
的,即当程序异常终止时,也不会生成core dump
文件。
kkk@kkk-VirtualBox:~/桌面$ ulimit -c
0
- 使用命令
ulimit -c unlimited
来开启core dump
功能,并且不限制core dump
文件的大小;如果需要限制文件的大小,将unlimited
改成你想生成core
文件最大的大小。 - 上面的命令只会对当前的终端环境有效,如果想需要永久生效。可以修改文件
/etc/security/limits.conf
文件。
kkk@kkk-VirtualBox:~/桌面$ sudo gedit /etc/security/limits.conf
# - rtprio - max realtime priority
# - chroot - change root to directory (Debian-specific)
#
#<domain> <type> <item> <value>
* soft core unlimited
- 修改core文件保存的路径
- 默认生成的core文件保存在可执行文件所在的目录下,文件名为
core
- 通过修改
/proc/sys/kernel/core_uses_pid
文件可以让生成core
文件名是否自动加上pid
号。- 例如
echo 1 > /proc/sys/kernel/core_uses_pid
,生成的core
文件名见会变成core.pid
,其中pid
表示该进程的PID。
- 例如
- 还可以通过修改
/proc/sys/kernel/core_pattern
来控制生成core
文件保存的位置以及文件名格式。- 例如可以用
echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern
设置生成的core
文件保存在/tmp/corefile
目录下
- 例如可以用
- 默认生成的core文件保存在可执行文件所在的目录下,文件名为
使用gdb调试Core文件
- 首先,使用
gcc
编译源文件,加上-g
以增加调试信息; - 按照上面打开
core dump
使程序异常终止时能生成core
文件; - 运行程序,使用命令
gdb program core
来查看core
文件,其中program
为可执行程序名,core
为生成的core
文件名。