专栏首页sunsky如何快速定位找出SEGV内存错误的程序Bug

如何快速定位找出SEGV内存错误的程序Bug

通过查看php日志/usr/local/php/var/log/php-fpm.log,有如下警告信息:

  1. [16-Mar-2015 16:03:09] WARNING: [pool www] child 9453 exited on signal 11 (SIGSEGV) after 9.601040 seconds from start

日志中的信息表明,进程号为9453的进程由于收到SIGSEGV信号而退出了。收到这个信号的时候,程序是可以生成core文件的。不过通过日志我们可以知道进程9453退出时没有生成core文件。因为在php-fpm的日志中,如果退出时生成了core文件,日志中会有“SIGSEGV – core dumped”字样。如:

  1. [16-Mar-2015 16:04:29] WARNING: [pool www] child 9581 exited on signal 11 (SIGSEGV - core dumped) after 15.921916 seconds from start

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

如何生成core文件

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

  1. [root@linuxeye ~]# ulimit -a
  2. core file size (blocks, -c) 0
  3. data seg size (kbytes, -d) unlimited
  4. scheduling priority (-e) 0
  5. file size (blocks, -f) unlimited
  6. pending signals (-i) 5762
  7. max locked memory (kbytes, -l) 64
  8. max memory size (kbytes, -m) unlimited
  9. open files (-n) 65535
  10. pipe size (512 bytes, -p) 8
  11. POSIX message queues (bytes, -q) 819200
  12. real-time priority (-r) 0
  13. stack size (kbytes, -s) 10240
  14. cpu time (seconds, -t) unlimited
  15. max user processes (-u) 65535
  16. virtual memory (kbytes, -v) unlimited
  17. file locks (-x) unlimited

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

  1. [root@linuxeye ~]# ulimit -c unlimited
  2. [root@linuxeye ~]# ulimit -a
  3. core file size (blocks, -c) unlimited
  4. data seg size (kbytes, -d) unlimited
  5. scheduling priority (-e) 0
  6. file size (blocks, -f) unlimited
  7. pending signals (-i) 5762
  8. max locked memory (kbytes, -l) 64
  9. max memory size (kbytes, -m) unlimited
  10. open files (-n) 65535
  11. pipe size (512 bytes, -p) 8
  12. POSIX message queues (bytes, -q) 819200
  13. real-time priority (-r) 0
  14. stack size (kbytes, -s) 10240
  15. cpu time (seconds, -t) unlimited
  16. max user processes (-u) 65535
  17. virtual memory (kbytes, -v) unlimited
  18. file locks (-x) unlimited

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

如果想永久生效,可以把命令加入到 /etc/profile 中。建议不要这样做, 会疯狂dump文件,浪费性能

如何找到core文件

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

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

  1. # vi /etc/sysctl.conf
  2. kernel.core_uses_pid = 1 #追加进程号到core文件名中
  3. fs.suid_dumpable = 2 #确保设置属主的进程也可以生成core文件
  4. kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t #指定core文件生成的位置和文件名规则。

文件名规则可以使用的参数有:

  1. %% – 符号%
  2. %p – 进程号
  3. %u – 进程用户id
  4. %g – 进程用户组id
  5. %s – 生成core文件时收到的信号
  6. %t – 生成core文件的 时间 (seconds since 0:00h, 1 Jan 1970)
  7. %h – 主机名
  8. %e – 程序文件名

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

  1. # sysctl -p

重启php-fpm

  1. service php-fpm restart

重现502错误

访问http://demo.linuxeye.com/wp-admin/customize.php?theme=dux

日志/usr/local/php/var/log/php-fpm.log中会有"SIGSEGV – core dumped"字样

如何使用core文件

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

  1. gdb -e /usr/local/php/sbin/php-fpm -c /tmp/core-php-fpm-11-501-501-9581-1426493066

根据上面的堆栈信息,可以知道iplookup扩展有问题,编辑/usr/local/php/etc/php.ini,注销掉iplookup段,重启php-fpm ,正常。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mysql事务隔离级别详解和实战

    设置innodb的事务级别方法是:set 作用域 transaction isolation level 事务隔离级别,例如~

    sunsky
  • posix,perl正则表达式区别

    1、正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式、正规表示式或常规表达式或正规化表示法或正规表...

    sunsky
  • serf 中去中心化系统的原理和实现

    原文:https://www.infoq.cn/article/principle-and-impleme-of-de-centering-system-in-...

    sunsky
  • linux 下 core 相关知识总结

    在以往的测试过程中,每当遇到程序出现coredump的状况,我的第一反应就是有bug,让开发定位原因,但是如果自己能够去挖掘原因,在与开发沟通的过程中能明确指出...

    易惠芳
  • linux下core file size设置笔记

    现象说明:突然发现一台测试机器的java程序莫名其妙地没了,但是没有core dump!这就需要打开服务器的core文件生成的功能了,(即core dump文件...

    洗尽了浮华
  • Qt5.12 + OpenGL 创建第一个多边形Core版

    https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/

    用户5908113
  • Linux下使用gdb调试core文件

    当程序运行过程中出现Segmentation fault (core dumped)错误时,程序停止运行,并产生core文件。core文件是程序运行状态的内存映...

    Dabelv
  • linux core文件机制

    在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所...

    一见
  • CMake 进行调试

    在 Linux 下开发,可以用 gdb 进行调试,但是如果工程是用 CMake 构建的,那么需要在 CMakeLists.txt 中加入如下代码:

    Frank909
  • Linux下core文件的使用方法详解

    有时候程序会异常退出而不带任何日志,此时就可以使用 code 文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息

    砸漏

扫码关注云+社区

领取腾讯云代金券