资讯专栏INFORMATION COLUMN

使用 gdb 调试 PHP core

Code4App / 2601人阅读

摘要:一开启查看是否开启输出打开文件记录关闭文件记录设置内核出来的存放路径注意目录要有权限给写二调试准备文件获取地址保存在服务器上,例如备用。

一、开启 查看是否开启 core dump 输出

ulimit -a

打开 core dump 文件记录

ulimit -c unlimited

yum install gdb php-dbg

关闭 core dump 文件记录

ulimit -c 0

设置内核core dump出来的存放路径(注意目录要有权限给php写):
echo "/tmp/core.%e.%p.%t" > /proc/sys/kernel/core_pattern

二、调试 1、准备 .gdbinit 文件

获取地址:https://github.com/php/php-src/blob/master/.gdbinit
保存在服务器上,例如 /root/.gdbinit 备用。

2、用 gdb 打开 core 文件

gdb php-fpm -c core-php-fpm.920

可以看到类似下边的字样:

Core was generated by `php-fpm: pool www            ".
Program terminated with signal 11, Segmentation fault.
3、查看 core 发生时刻的堆栈
(gdb) bt
#0  zend_mm_alloc_small (size=) at /usr/src/debug/php-7.0.6/Zend/zend_alloc.c:1295
#1  zend_mm_alloc_heap (size=) at /usr/src/debug/php-7.0.6/Zend/zend_alloc.c:1366
#2  _emalloc (size=) at /usr/src/debug/php-7.0.6/Zend/zend_alloc.c:2450
#3  0x00007f7a6fad0511 in apm_sprintf (fmt=0x7f7a6faeff50 "
 %04d-%02d-%02d %02d:%02d:%02d Version %s
 Process %d received signal %2d: %s , bss[%p]
")
    at /PHP/64/source/php7.0.0_nzts/ext/apm/apm_common.c:371
#4  0x00007f7a6facbefd in print_backtrace (sig=11) at /PHP/64/source/php7.0.0_nzts/ext/apm/apm.c:1937
#5  0x00007f7a6facbfd7 in agent_fatal_signal_handler (sig=11) at /PHP/64/source/php7.0.0_nzts/ext/apm/apm.c:1955
#6  
#7  zend_mm_alloc_small (size=) at /usr/src/debug/php-7.0.6/Zend/zend_alloc.c:1295
#8  zend_mm_alloc_heap (size=) at /usr/src/debug/php-7.0.6/Zend/zend_alloc.c:1366
4、引入 PHP 源代码中提供的 .gdbinit (gdb 命令编写脚本)
(gdb) source /root/.gdbinit
5、查看 backtrace 和变量值
(gdb) zbacktrace
[0x7f7a75e138c0] C("DEBUG") /usr/share/nginx/html/smartphp/common.php:28
[0x7f7a75e137d0] Model->_connectDb() /usr/share/nginx/html/smartphp/core/Model.class.php:44
[0x7f7a75e13680] Model->bindData("SELECT40tips40FROM40keyword_phone40WHERE40word=:word", array(1)[0x7f7a75e136f0], "getdata") /usr/share/nginx/html/smartphp/core/Model.class.php:143
[0x7f7a75e13580] Model->getData("SELECT40tips40FROM40keyword_phone40WHERE40word=:word", array(1)[0x7f7a75e135f0]) /usr/share/nginx/html/smartphp/core/Model.class.php:215
[0x7f7a75e134c0] Model->getField("SELECT40tips40FROM40keyword_phone40WHERE40word=:word", array(1)[0x7f7a75e13530]) /usr/share/nginx/html/appdata/smartphp/core/Model.class.php:264
(gdb) print ((zval *)0x7f7a75e13530)
$1 = (zval *) 0x7f7a75e13530

(gdb) printzv $1
[0x7f7a75e13530] (refcount=3) array:     Packed(1)[0x7f7a75e94888]: {
      [0] 0 => [0x7f7a75e6ad88] (refcount=4) string: PP红包。
}

https://bugs.php.net/bugs-generating-backtrace.php
http://www.laruence.com/2011/06/23/2057.html
https://kn007.net/topics/php-fpm-how-to-core-dump/
http://www.laruence.com/2011/12/06/2381.html

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21585.html

相关文章

  • gdb调试PHP扩展错误

    摘要:有时候,使用的第三方扩展之后,可能会发生一些错误,这个时候,可能就需要更底层的方式追踪调试程序发生错误的地方和原因,熟悉下编程的肯定不陌生首先,使用命令,查看系统是否会生成文件返回结果可能是当返回结果为时,说明系统不会生成文件,这个时候 有时候,使用PHP的第三方扩展之后,可能会发生一些错误,这个时候,可能就需要更底层的方式追踪调试程序发生错误的地方和原因,熟悉linux下C编程的肯定...

    Aklman 评论0 收藏0
  • 关于PHP程序员解决问题的能力

    摘要:但执行后没有任何信息输出,这时候通过什么方法能知道程序错在哪里这里可以将解决问题能力分为个等级,越到后面的表示能力越强。这个考验全部通过,表明此程序员已经具备了专业程序员应该有的解决问题能力了。 这个话题老生长谈了,在面试中必然考核的能力中,我个人认为解决问题能力是排第一位的,比学习能力优先级更高。解决问题的能力既能看出程序员的思维能力,应变能力,探索能力等,又可以看出他的经验。如果解...

    lauren_liuling 评论0 收藏0
  • 使用 gdb 调试 PHP 扩展

    摘要:来自的扩展使用开发,可以很容易的使用进行调试。运行返回实际就是在函数名前面添加,然后进行调试第一步运行然后运行终端提示输入输入此时会回显然后输入显示其中文件的内容为可以看到,函数源代码已经出来了,可以使用常用的命令进行调试了。 来自:http://www.codefrom.com/paper/%E4%BD%BF%E7%94%A8gdb%E8%B0%83%E8%AF%95p... ...

    golden_hamster 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<