GDB学习之Core Dump-linux

    很多版本的Linux都是关闭coredump功能的。可以使用ulimit –c来判断当前系统是否启用core dump

点击(此处)折叠或打开

  1. $ulimit c
  1. 0

-c为内核core dump文件大小限制,0表示该系统没有开启core dump,可以使用下边的命令来开启core dump

点击(此处)折叠或打开

  1. $ulimit c unlimited

以下边的程序为例来看一下core文件。coredump.cpp

点击(此处)折叠或打开

  1. #include
  2. int main()
  3. {
  4.     int *a = NULL;
  5.     *a = 0;
  1.     return 0;
  1. }

使用下边的命令进行编译并运行,-g为加入调试信息,在用GDB调试的时候会用到。

点击(此处)折叠或打开

  1. g++ coredump.cpp -g -o coredump
  1. ./coredump

可以看到在程序所在目录生成了一个core文件,可以使用GDB调试生成的core文件,命令如下:

点击(此处)折叠或打开

  1. $gdb -c core ./coredump
  2. GNU gdb 6.8-debian
  1. Copyright (C) 2008 Free Software Foundation, Inc.
  1. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  2. This is free software: you are free to change and redistribute it.
  3. There is NO WARRANTY, to the extent permitted by law. Type "show copying"
  4. and "show warranty" for details.
  1. This GDB was configured as "i486-linux-gnu"...
  1. warning: Can't read pathname for load map: Input/output error.
  1. Reading symbols from /usr/lib/libstdc++.so.6...done.
  1. Loaded symbols for /usr/lib/libstdc++.so.6
  1. Reading symbols from /lib/tls/i686/cmov/libm.so.6...done.
  1. Loaded symbols for /lib/tls/i686/cmov/libm.so.6
  1. Reading symbols from /lib/libgcc_s.so.1...done.
  1. Loaded symbols for /lib/libgcc_s.so.1
  2. Reading symbols from /lib/tls/i686/cmov/libc.so.6...done.
  3. Loaded symbols for /lib/tls/i686/cmov/libc.so.6
  1. Reading symbols from /lib/ld-linux.so.2...done.
  1. Loaded symbols for /lib/ld-linux.so.2
  2. Core was generated by `./coredump'.
  3. Program terminated with signal 11, Segmentation fault.
  4. [New process 3346]
  5. #0 0x080484a4 in main () at coredump.cpp:6
  6. 6 *a = 0;

从上面的信息可以看到,错误出现在第六行收到了信号11,即Segmentation fault

    默认情况下,系统在当前文件夹下生成core文件,若希望在指定路径下生成core文件,需要在/etc/sysctl.conf中设置:

点击(此处)折叠或打开

  1. 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命令来进行修改,例如:

点击(此处)折叠或打开

  1. cat /proc/4023/coredump_filter
  2. echo 1 > /proc/4023/coredump_filter

你可能感兴趣的:(常用知识)