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

简介: 使用单进程、strace、gdb调试PHP错误PHP一般是在FPM的呵护下运行的,但是某些情况下进程异常崩溃会导致502。下面是解决思想: 1. 单进程运行: php -d display_errors=1 -S 0.

使用单进程、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.6054
GNU 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扩展,为了分析性能,我们安装了第三方编译过的版本。将该扩展从灰度环境中下线,段错误问题就不再出现了。

 

 

谋胆并重
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
6月前
|
算法 IDE PHP
PHP编程中的错误处理与调试技巧
在PHP编程过程中,错误处理和调试是至关重要的环节。本文将介绍一些常见的PHP错误类型、优秀的调试工具以及有效的调试技巧,帮助开发者更高效地定位和解决代码中的问题。
60 3
|
4天前
|
IDE PHP 开发工具
【PHP开发专栏】Xdebug在PHP调试中的应用
Xdebug 是一个功能强大的 PHP 扩展,提供调试、代码分析和性能分析等功能。本文介绍了 Xdebug 的基本概念、安装配置方法及在 PHP 调试中的应用技巧,包括断点调试、堆栈跟踪、远程调试和性能分析等。通过合理使用 Xdebug,可以显著提高调试效率和代码质量。
16 2
|
2月前
|
监控 IDE PHP
php xdebug的配置、调试、跟踪、调优、分析
php xdebug的配置、调试、跟踪、调优、分析
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
60 10
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
2月前
|
测试技术 PHP 数据库
PHP中的异常处理与错误调试
【9月更文挑战第17天】在PHP编程中,遇到问题和错误是在所难免的。了解如何正确处理这些异常,并有效地进行错误调试,是提升代码质量和开发效率的关键。本文将引导你理解PHP中的异常处理机制,并通过实际代码示例,展示如何捕捉、处理异常以及进行错误调试,帮助你构建更健壮的应用程序。
|
3月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
92 0
|
5月前
|
PHP 开发者
PHP中的异常处理与错误调试
【6月更文挑战第29天】在PHP开发过程中,异常处理和错误调试是保证代码质量与应用稳定性的重要环节。本文将深入探讨PHP的异常处理机制,介绍如何通过try-catch语句捕获异常,以及自定义异常类的创建和使用。同时,文章还将讨论PHP错误类型、错误日志记录和有效的错误调试方法,帮助开发者提高问题诊断与解决能力。
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
41 1
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
31 0
下一篇
无影云桌面