IT技术博客大学习 共学习 共进步

怎样用core文件调试你的linux程序?

博学无忧 2014-03-19 22:44:47 浏览 3,886 次

   core dump 文件对于诊断linux中程序的问题非常有用。当程序异常退出的时候,可能会生成core文件。如,程序写一个不属于他的内存,操作系统出于保护,会发信号给程序,程序可能会因此而退出,退出的时候可能会生成core文件。我们可以通过分析core文件,找出程序中那里有内存问题。这篇文章主要是阐述生成core文件需要做的一些设置。

   如何生成core文件

   默认linux操作系统是不允许生成core文件的。如下图:

   ulimit

   我们可以通过如下命令解除限制:

   #ulimit -c unlimited

   这时候,再看

   ulimit1

   注意,ulimit -c 的设置仅仅是对你完成设置后启动的进程有效。而且退出登陆后,再进入需要从新设置。否则从新登陆后启动的进程也无法生成core文件。

   如果想永久生效,可以把命令加入到 /etc/profile 中。建议不要这样做,想想为啥?

   如何找到core文件

   一般情况下,core文件会生成在你执行程序的地方。文件名是core.进程号

   你也可以指定core文件名和生成目录。在 /etc/sysctl.conf 文件中指定。

# vi /etc/sysctl.conf

   添加如下行:

   kernel.core_uses_pid = 1

   kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t

   fs.suid_dumpable = 2

   kernel.core_uses_pid = 1 - 追加进程号到core文件名中

   fs.suid_dumpable = 2 - 确保设置属主的进程也可以生成core文件

   kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t - 指定core文件生成的位置和文件名规则。文件名规则可以使用的参数有:

   %% - 符号%

   %p - 进程号

   %u - 进程用户id

   %g - 进程用户组id

   %s - 生成core文件时收到的信号

   %t - 生成core文件的 时间 (seconds since 0:00h, 1 Jan 1970)

   %h - 主机名

   %e - 程序文件名

   执行如下命令,让设置生效

#sysctl -p

   除此之外,也可以通过如下方式指定core文件名和路径

$echo /tmp/core-%e-%s-%u-%g-%p-%t > /proc/sys/kernel/core_pattern

   如何使用core文件

   可以使用gdb命令查看core文件信息

$ gdb -e /path/to/application -c /path/to/corefile

建议继续学习

  1. 深入理解Nginx之调试优化技巧 (阅读 8,104)
  2. 又一个PHP低概率Core的分析(PHP内存管理) (阅读 4,263)
  3. 如何调试PHP的Core之获取基本信息 (阅读 3,405)
  4. PHP stream未能及时清理现场导致Core的bug (阅读 3,283)
  5. 更简单的重现PHP Core的调用栈 (阅读 3,045)
  6. 获取 MySQL 崩溃时的 core file (阅读 2,763)