使用单进程、strace、gdb调试PHP错误

小编 2026-07-08 阅读:1480 评论:0
使用单进程、strace、gdb调试PHP错误PHP一般是在FPM的呵护下运行的,但是某些情况下...
使用单进程、strace、gdb调试PHP错误

PHP一般是在FPM的呵护下运行的,但是某些情况下进程异常崩溃会导致502。下面是解决思想:
1. 单进程运行:

php -d display_errors=1 -S 0.0.0.0:88 #然后访问,会直接显示fatal or error的信息
2. 以上不能解决,则采用strace

strace  -d  -f -ff -o trace.log  -p FPM_ID#或者:strace -d -p FPM_ID

  3. 如果还没解决问题,就得运用gdb (gnu's debug), 举个粟子:

最近在灰度测试PHP7的过程中,php-fpm出现间歇性的段错误。系统的错误信息如下:

php-fpm[7664]: segfault at 7f6ff4600000 ip 00007f6ff782176f sp 00007fff2e9c2fe8 error 4 in libc-2.12.so[7f6ff7798000+18a000]

为了排查出错的原因,我们接下来需要进行调试。由于错误间歇性出现在php-fpm处理请求的过程中,因此,我们需要获取获取Linux的core dumps文件。

打开Linux的core dumps

一般情况下,Linux默认core dumps是关闭状态。我们可以将其打开并且重定向到我们指定的文件。

$ echo '/tmp/coredump-%e.%p' > /proc/sys/kernel/core_pattern

core dumps文件支持变量:

%%  a single % character%c  core file size soft resource limit of crashing process (since    Linux 2.6.24)%d  dump mode—same as value returned by prctl(2) PR_GET_DUMPABLE    (since Linux 3.7)%e  executable filename (without path prefix)%E  pathname of executable, with slashes ('/') replaced by    exclamation marks ('!') (since Linux 3.0).%g  (numeric) real GID of dumped process%h  hostname (same as nodename returned by uname(2))%p  PID of dumped process, as seen in the PID namespace in which    the process resides%P  PID of dumped process, as seen in the initial PID namespace    (since Linux 3.12)%s  number of signal causing dump%t  time of dump, expressed as seconds since the Epoch,    1970-01-01 00:00:00 +0000 (UTC)%u  (numeric) real UID of dumped process

这个例子中,我们把错误文件重定向到/tmp目录下。

配置php-fpm支持core dumps

为了让php-fpm支持core dumps,我们需要打开php-fpm连接池的rlimit_core配置,在配置文件中设置。

rlimit_core = unlimited

重启php-fpm进程,当SIGSEGV信号量产生时,将会在你指定的core dumps目录产生指定的文件:

$ ls /tmp/coredump*-rw------- 1 user group 220M /tmp/coredump-php-fpm.2393

使用gdb读取core dumps文件

首先,确认你的机器中正确安装了gdb调试工具(yum install gdb)。然后,你将使用gdb $program-path $coredump-path这样的命令格式调试。由于我们的程序运行在php-fpm,我们将使用以下的命令调试:

$ gdb /usr/local/services/php7/sbin/php-fpm core.6054GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)Copyright (C) 2010 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later <http://g...Core was generated by `php-fpm: pool www                                                             '.Program terminated with signal 11, Segmentation fault.#0  0x00007f54017dc76f in memcpy () from /lib64/libc.so.6...(gdb) bt#0  0x00007f54017dc76f in memcpy () from /lib64/libc.so.6#1  0x00007f53fdf96443 in zend_string_init (execute_data=0x7f53fe416fc0)    at /usr/local/services/php7/include/php/Zend/zend_string.h:159#2  hp_execute_ex (execute_data=0x7f53fe416fc0)    at /usr/local/src/xhprof-php7/extension/xhprof.c:1476#3  0x00000000008c28b0 in ZEND_DO_FCALL_SPEC_HANDLER ()    at /data/software/php-7.0.6/Zend/zend_vm_execute.h:800#4  0x00000000008851cb in execute_ex (ex=Unhandled dwarf expression opcode 0xf3)    at /data/software/php-7.0.6/Zend/zend_vm_execute.h:414

bt命令将会显示core dumps文件的调用栈。到此为止,我们定位到问题出现在/usr/local/src/xhprof-php7/extension/xhprof.c文件在调用memcpy()方法时,出现内存段错误。

结语

目前PHP7官方并未支持xhprof扩展,为了分析性能,我们安装了第三方编译过的版本。将该扩展从灰度环境中下线,段错误问题就不再出现了。

 

 

谋胆并重
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表