php core,分析php core dump的原因

发现问题

最近发现服务器频繁出现core.xxx文件,并且php-fpm.log有类似这样的记录

WARNING: [pool www] child 2930 exited on signal 7 (SIGBUS - core dumped) after 22458.193927 seconds from start

说明有php-fpm进程异常退出了,业务侧的表现就是某些功能第1次打开异常(如显示空白),再点击又正常,这种现象的原因该php-fpm进程异常退出了。

分析问题的的原因

最直接的办法就是用gdb工具对core.xxx进行分析了。

gdb /usr/local/php56/sbin/php-fpm -c /tmp/core.4522

输入命令bt,会列出退出前的堆栈信息,如

#0 lex_scan (zendlval=zendlval@entry=0x7ffc0ef65bb8) at Zend/zend_language_scanner.c:1082

#1 0x0000000000705642 in zendlex (zendlval=zendlval@entry=0x7ffc0ef65bb0) at /usr/local/src/php-5.6.32/Zend/zend_compile.c:6919

#2 0x00000000006e0256 in zendparse () at /usr/local/src/php-5.6.32/Zend/zend_language_parser.c:3732

#3 0x00000000006e5a08 in compile_file (file_handle=, type=2) at Zend/zend_language_scanner.l:586

#4 0x00000000005ab802 in phar_compile_file (file_handle=, type=) at /usr/local/src/php-5.6.32/ext/phar/phar.c:3370

#5 0x00007fb2962aebb4 in compile_and_cache_file (file_handle=file_handle@entry=0x7ffc0ef682f0, type=type@entry=2,

key=key@entry=0x7fb2964cbafc "/webroot:./Application/Runtime/Cache/VendorApi/48b1f9c30fb6cceae8315a38de289ddd.php:/webroot/ThinkPHP/Library/Think/Storage/Driver:A", key_length=166, op_array_p=op_array_p@entry=0x7ffc0ef681e0,

可以看到最开始一条记录,是函数lex_scan异常退出了,lex是属于词法分析的zend方法,往下看也可以发现业务侧的代码,如/webroot:./Application/Runtime/Cache/VendorApi/48b1f9c30fb6cceae8315a38de289ddd.php,根据上述代码可以知道是分析这个文件时出错了,打开这个文件看看是什么内容:

嗯,一个thinkphp的xml模板文件,看到这个文件基本可以定位原因了,是由<?xml version="1.0" encoding="utf-8"?>这个标签php无法正确进行语法解析, 进而导致php-fpm整个进程退出了。剩下的解决办法就好处理了,结合业务侧把<?xml version="1.0" encoding="utf-8"?>先从模板里删除,或移动到其它地方再输出。更新代码后,删除此目录下的缓存文件Application/Runtime/Cache/VendorApi/让thinkphp重新生成。

上面的分析方法,因为有业务侧的代码显现,还比较容易定位问题,否则就要借助php提供的.gdbinit脚本了,它能将更高层的业务跟踪代码显示出来,.gdbinit文件的位置一般是在/usr/local/src/php-5.6.30/.gdbinit目录下(php后的版本号根据你的环境修改,或者通过find方法搜索,或在这下载https://github.com/php/php-src/blob/master/.gdbinit)。 仍停留在上面的gdb交互环境里,执行命令source /usr/local/src/php-5.6.30/.gdbinit,再执行命令zbacktrace,则会打印更多业务侧的代码,如下

(gdb) source /usr/local/src/php-5.6.30/.gdbinit

(gdb) zbacktrace

[0x7fb2a45a4a38] load() /webroot/ThinkPHP/Library/Think/Storage/Driver/File.class.php:80

[0x7ffc0ef68560] Think\Storage\Driver\File->load("./Application/Runtime/Cache/VendorApi/48b1f9c30fb6cceae8315a38de289ddd.php", array(1)[0x32adaf8], NULL, "tpl")

[0x7fb2a45a4900] call_user_func_array(array(2)[0x32c7e28], array(4)[0x32c7c60]) /webroot/ThinkPHP/Library/Think/Storage.class.php:37

[0x7ffc0ef68860] Think\Storage::__callstatic("load", array(4)[0x32c7dc8])

[0x7fb2a45a4798] Think\Storage::load("./Application/Runtime/Cache/VendorApi/48b1f9c30fb6cceae8315a38de289ddd.php", array(1)[0x32adaf8], NULL, "tpl") /webroot/ThinkPHP/Library/Think/Template.class.php:77

[0x7fb2a45a4620] Think\Template->fetch("./Application/VendorApi/View/Lvmama/push_product_change_info.html", array(1)[0x32adaf8], "") /webroot/Application/Runtime/common~runtime.php:1

[0x7fb2a45a44c8] Behavior\ParseTemplateBehavior->run(array(4)[0x32aebf8]) /webroot/Application/Runtime/common~runtime.php:1

也可以发现php-fpm是在处理./Application/Runtime/Cache/VendorApi/48b1f9c30fb6cceae8315a38de289ddd.php后失败就结束了。

观察一段时间后没再出现core dump,到此,问题得到解决。

如果要调用运行中的进程,可以gdb --pid=xxx或gdb -p xxx。

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 当使用php-fpm生成core dump时,可以使用gdb进行调试。需要注意的是,由于生成core dump的是php-fpm,所以需要使用php-fpm进行调试。如果是在cli模式下使用php生成的core dump,则需要使用php程序进行调试。在调试过程中,可以查看调用栈信息来定位问题。例如,在调试过程中,可以使用gdb命令查看主函数的调用栈信息,如#17 0x00000000006ed0ba in main (argc=2, argv=0x7fff4efcb2a8) at /root/php-5.3.27/sapi/fpm/fpm/fpm_main.c:1929。同时,还可以使用gdb命令查看php执行脚本的调用栈信息,如#16 0x000000000058056c in php_execute_script (primary_file=0x7fff4efcb080) at /root/php-5.3.27/main/main.c:2316。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [使用GDB调试PHP core dump](https://blog.csdn.net/weixin_29748637/article/details/115987071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [在php-fpm下,服务器间歇出现core dump 追踪到php代码是include一个php文件](https://blog.csdn.net/weixin_40004960/article/details/115941227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值