很多版本的Linux都是关闭core dump功能的。可以使用ulimit –c来判断当前系统是否启用core dump。
-c为内核core dump文件大小限制,0表示该系统没有开启core dump,可以使用下边的命令来开启core dump。
点击(此处)折叠或打开
- $ulimit –c
- 0
点击(此处)折叠或打开
- $ulimit –c unlimited
以下边的程序为例来看一下core文件。coredump.cpp
点击(此处)折叠或打开
- #includestdio.h>
- int main()
- {
- int *a = NULL;
- *a = 0;
- return 0;
- }
使用下边的命令进行编译并运行,-g为加入调试信息,在用GDB调试的时候会用到。
点击(此处)折叠或打开
- g++ coredump.cpp -g -o coredump
- ./coredump
可以看到在程序所在目录生成了一个core文件,可以使用GDB调试生成的core文件,命令如下:
点击(此处)折叠或打开
- $gdb -c core ./coredump
- GNU gdb 6.8-debian
- Copyright (C) 2008 Free Software Foundation, Inc.
- License GPLv3+: GNU GPL version 3 or later <>>
- This is free software: you are free to change and redistribute it.
- There is NO WARRANTY, to the extent permitted by law. Type "show copying"
- and "show warranty" for details.
- This GDB was configured as "i486-linux-gnu"...
- warning: Can't read pathname for load map: Input/output error.
- Reading symbols from /usr/lib/libstdc++.so.6...done.
- Loaded symbols for /usr/lib/libstdc++.so.6
- Reading symbols from /lib/tls/i686/cmov/libm.so.6...done.
- Loaded symbols for /lib/tls/i686/cmov/libm.so.6
- Reading symbols from /lib/libgcc_s.so.1...done.
- Loaded symbols for /lib/libgcc_s.so.1
- Reading symbols from /lib/tls/i686/cmov/libc.so.6...done.
- Loaded symbols for /lib/tls/i686/cmov/libc.so.6
- Reading symbols from /lib/ld-linux.so.2...done.
- Loaded symbols for /lib/ld-linux.so.2
- Core was generated by `./coredump'.
- Program terminated with signal 11, Segmentation fault.
- [New process 3346]
- #0 0x080484a4 in main () at coredump.cpp:6
- 6 *a = 0;
从上面的信息可以看到,错误出现在第六行收到了信号11,即Segmentation fault。
默认情况下,系统在当前文件夹下生成core文件,若希望在指定路径下生成core文件,需要在/etc/sysctl.conf中设置:
点击(此处)折叠或打开
- kernel.core_pattern = /home/XXX/core/%t-%e-%p-%c.core
并且在命令行执行sysctl –p命令。这两步都需要有管理员权限才可以执行,格式符的具体含义和其他格式符的使用请参阅相关文档。
对于大规模系统,有的可能会使用几个G的内存,在这种情况下如果全部dump出来将会给磁盘造成巨大的压力。dump过程也会增加系统的负载,可能会导致服务的抖动或暂停。因此,内核增加了选择dump区段的功能。对于共享内存,所有的进程都是相同的内容,因此没有必要所有进行都dump出该段内存,只选择其中的一个进行进行dump就可以了。
设置可以通过设置/proc//coredump_filter来进行相关设置,coredump_filter使用比特位的形式来进行表示。
第0位:匿名专用内存
第1位:匿名公共内存
第2位:file-backed专用内存
第3位:file-backed共享内存
第4位:ELF文件映射。
可以使用cat命令来查看,使用echo命令来进行修改,例如:
点击(此处)折叠或打开
- cat /proc/4023/coredump_filter
- echo 1 > /proc/4023/coredump_filter