网址:php.net | 支持 | 文档 | 报告错误 | 高级搜索 | 搜索如何操作 | 统计学 | 随机错误 | 登录

Unix公司|窗户

生成gdb回溯

注意到PHP崩溃

没有绝对的方法知道PHP正在崩溃,但可能有迹象。通常,如果您访问的页面总是应该生成输出(例如,一个前导HTML块),突然得到“Document contains no data”在您的浏览器中,这可能意味着PHP在执行脚本。另一种判断PHP崩溃的方法是查看Apache错误日志,并查找SEGV(Apache 1.2)或分段故障1.3).

重要!

要获得包含正确信息的回溯,您必须具备非剥离PHP二进制文件!

如果您还没有核心文件:

  • 删除shell中对堆芯转储大小的任何限制:
    • tcsh:取消限制核心转储大小
    • bash/sh:ulimit-c无限制
  • 确保运行PHP的目录,或启用了PHP的httpd,对运行PHP的用户具有写入权限。
  • 导致PHP崩溃:
    • PHPCGI:只需使用使其崩溃的脚本运行PHP
    • PHP Apache模块:运行httpd-X并访问使PHP崩溃的脚本

在Linux上获取核心的通用方法

  • 设置核心模式(按如下方式运行此命令):
    • echo“<cores dir>/core-%e.%p”>/proc/sys/kernel/core_pattern
    • 确保该目录可由PHP写入
  • 设置ulimit(请参阅上面的操作方法)。
  • 重新启动/重新运行PHP。

在此之后,系统中的任何进程(包括PHP)崩溃都会留下指定目录中的核心文件核心模式.

获得核心文件后:

  • 使用PHP或启用PHP的httpd二进制文件的路径和路径运行gdb到核心文件。一些示例:
    • gdb/usr/local/apache/sbin/httpd/usr/local/apache/sbin/core
    • gdb/home/user/dev/php-snaps/sapi/cli/php/home/user/deve/testing/core
  • 在gdb提示符下,运行:
    • (gdb)bt公司

如果无法获取核心文件:

  • 在gdb下运行httpd-X,如下所示:
    • gdb/usr/local/apache/sbin/httpd
    • (gdb)运行-X
  • 然后使用web浏览器访问服务器以强制崩溃。应该会看到一个gdb提示符出现,并且有一些消息表明是一场车祸。在这个gdb提示符下,键入:
    • (gdb)bt公司
    • 或者,从命令行运行
      • gdb/home/user/dev/php-snaps/sapi/cli/php
        • (gdb)运行/path/to/script.php
        • (gdb)bt公司

这应该生成一个回溯,您应该在错误报告中提交,以及您可以提供的有关您的设置和冒犯的任何其他详细信息脚本。

查找导致segfault的函数调用:

您可以使用gdb轻松找到导致segfault的函数调用。首先,您需要一个核心文件或在gdb下生成一个segfault,如前所述以上。

在PHP中,每个函数都由一个名为执行()并且有自己的堆栈。英国电信公司命令表示函数调用堆栈。通常情况下将看到几个执行()发布时的行英国电信公司.你对最后一个感兴趣执行()堆栈(即最小帧号)。你可以移动当前工作堆栈向上的,向下框架命令。下面是一个gdb会话示例,可以用于指导如何处理segfault。

  • gdb会话示例
  • (gdb)bt公司#zend_alloc.c:240处的_efree(ptr=0xbffdb9b)中的0 0x080ca21b#在zend_variables处的_zval_dtor(zvalue=0x8186b94)中为1 0x080d691a。c:44#2 0x080cfab3位于zend_execute_API.c:274的_zval_ptr_dtor(zval_pr=0xbffffdbfc)中#3 0x080f1cc4正在执行(op_array=0x816c670)/zend_execute.c:1605#4 0x080f1e06正在执行(op_array=0x816c530)/zend_execute.c:1638#5 0x080f1e06正在执行(op_array=0x816c278)/zend_execute.c:1638#6 0x080f1e06正在执行(op_array=0x8166eec)/zend_execute.c:1638#zend_execute_scripts中的7 0x080d7b93(type=8,retval=0x0,file_count=3)位于zend.c:810#main.c:1310处php_execute_script(primary_file=0xbfff650)中的8 0x0805ea75#cgi_main.c:753处main中的9个0x0805cdb3(argc=2,argv=0xbfff6fc)#10 0x400c91位于__libc_start_main(main=0x805c580
    ,argc=2,ubp_av=0xbfff6fc,初始化=0x805b080<输入>,fini=0x80f67b4<输入>,stack_end=0xbfff6ec)在/sysdeps/generic/libc-start.c:129(gdb)帧3#3 0x080f1cc4正在执行(op_array=0x816c670)/zend_execute.c:1605(gdb)打印(char*)(executor_globals.function_state_ptr->函数)->common.function_name14美元=0x80fa6fa“pg_result_error”(gdb)打印(char*)executor_globals.active_op_array->函数名$15=0x816cfc4“结果错误”(gdb)打印(char*)executor_globals.active_op_array->文件名$16=0x816afbc“/home/yohgaki/php/DEV/segfault.php”(gdb)

在本节课中,第3帧是最后一帧执行()呼叫。这个框架3命令将当前工作堆栈移动到适当的框架。
打印(char*)(executor_globals.function_state_ptr->函数)->common.function_name
打印函数名。在示例gdb会话中pg结果错误()调用导致segfault。您可以打印任何如果您知道内部数据结构,请选择您喜欢的内部数据。请这样做不要询问如何使用gdb或内部数据结构。参考gdb手册用于gdb使用,以及用于内部数据结构的PHP源。

你可能看不到执行如果segfault在没有调用任何函数。

 
菲律宾比索 版权所有©2001-2024 PHP集团
保留所有权利。
上次更新时间:星期四9月26日01:01:27 2024 UTC