报告错误
错误
如果你认为你在 Xdebug 中发现了错误,请在错误跟踪页面上提交错误报告。你需要注册,因为这可以防止垃圾邮件发送者和其他滥用方滥用。尝试给尽可能多的信息来重现错误,这将极大的帮助修复它们。有关有用信息的一些提示,请查看以下部分。不再支持 2.9 之前的版本。
必填信息
创建每个错误报告应该准确描述:
- 你期望发生什么。
- 实际发生了什么。
- 我怎样才能重现这个问题。
为了防止无休止的反复,请始终提供如下信息:
-
需要一个简短和自包含的脚本来展示这个问题。
简短意味着最多 10 到 20 行,自包含表示它不能依赖于任何其他库或者数据库。
如果你在尝试几个小时后真的不能给出一个简短的脚本 ;-),那么请准备一些我能做的事情:从 GitHub 克隆,使用类似于 composer 的工具来安装依赖,然后运行。脚本仍然不能依赖于数据库之类的东西,因为我不会安装它们。如果你不确定,请先联系我。
-
Xdebug 的准确版本。
例如:
2.6.1
. -
PHP 版本(或版本范围)。
这可以在错误报告中选择。如果你使用的是 PHP 的开发版本,请使用带有
-dev
前缀的版本,例如7.4-dev
。 -
CLI 上的
php -v
的输出:derick@gargleblaster:~$ php -v PHP 7.2.14 (cli) (built: Jan 24 2019 11:47:11) ( NTS DEBUG ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.14, Copyright (c) 1999-2018, by Zend Technologies with Xdebug v2.7.0beta2-dev, Copyright (c) 2002-2018, by Derick Rethans
或者
phpinfo();
的输出中 "zend® engine" 标志旁边的信息: -
操作系统以及版本的信息。
例如: Debian Linux 9.2, OSX 10.10 using MAMP 5.2. 只是 "Linux" 或者 "Windows" 通常是不够的信息。
请不要包含 phpinfo();
完整的输出或者添加所有的配置设置。如果你认为 Xdebug 的 ini 设置对错误有一些影响,请仅仅提供这些配置设置。
除了上述信息之外,我可能需要更多的信息。这取决于你遇到的错误类型,对于单步调试错误和崩溃错误有用的信息是不同的。如果你不确定什么是有用的,请从上面必填信息部分提供信息。 这种情况如果需要更多的信息,我会将你指向这个页面上正确的部分。
单步调试器错误
为了使我能够找到和修复远程调试功能的错误,我需要一些信息。没有这个信息,我不能修复你的错误。需要的信息是:
- 每个错误报告所需的项目(脚本,Xdebug 版本,PHP 版本,发行版等,见上文)。
-
远程调试日志。
这个调试日志包含 Xdebug 和 IDE 之间的所有交互,并且跟踪错误发生的地方以及由于哪个协议命令产生的错误至关重要。
你可以使用 xdebug.remote_log php.ini 设置来创建远程调试日志。我建议你将其值设置为 /tmp
目录(或操作系统中相当的地方)中的位置。它已经设置如下:xdebug.remote_log=/tmp/xdebug.log
。确保运行脚本的用户(CLI 则为自己,或者如果你通过 Web 服务器调试那就是 Web 服务器的用户 ID)可以写入你指定的文件。
在准备好短脚本并启用远程日志记录后,现在逐步完成 IDE 中的代码(或者做任何你需要做的事情来重现它)。完成后,将脚本以及远程调试日志添加到 bugs.xdebug.org 上的错误报告。
日志的内容应该以以下内容开始:
Log opened at 2019-01-29 15:17:50 I: Connecting to configured address/port: localhost:9000. W: Creating socket for 'localhost:9000', poll success, but error: Operation now in progress (29). I: Connected to client. :-) -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///home/derick/media/movie/TheTube.php
崩溃错误
为了使查找和修复错误更容易,或者尽可能的容易,我需要标准的必要信息(脚本,Xdebug 版本,PHP 版本,发行版等,见上文)和一些其他的信息。
从命令行(CLI)重现错误容易得多,而不是通过 web 浏览器和 web 服务器。首先要尝试的事情是当使用 PHP CLI 运行的时候是否崩溃。在 shell 上,执行以下步骤:
export USE_ZEND_ALLOC=0 export ZEND_DONT_UNLOAD_MODULES=1 php your-script.php
如果仍然崩溃(你会看到出现类似 "Segmentation Fault" 或
"Bus Error"),那么这非常有用。为了提取更多信息,当你使用 Linux 或者 OSX ,请安装 gdb
(不是 lldb) 和 valgrind
工具。
为了有最好的机会修复崩溃错误,我需要以下信息:
创建一个 GDB 回溯
GDB 是一个调试 C 应用的工具,当进程崩溃(或在断点处停止)时提供它的状态信息。状态记录在回溯中,我们将在这里创建它。
在与上面相同的 shell 中,按照如下运行脚本:
gdb --args php your-script.php
你得到了一个 GDB 提示,在这里需要输入:
run
当脚本崩溃时,你得到了 GDB 提示,然后在这里运行:
bt full
这产生了大量信息,你需要以文件方式附加到错误报告。
创建 Valgrind 跟踪
Valgrind 是当程序运行时显示内存访问问题的工具。例如正在使用的已经释放的内存,或者还未初始化的内存。在 Derick的博客上有一篇关于 Valgrind 的文章。
在与上面相同的 shell 中(两处 export),按照如下运行脚本:
valgrind php your-script.php >/tmp/valgrind.log 2>&1
在命令返回提示后,应该有一个包含大量信息的文件 /tmp/valgrind.log
。请以文件方式附加到错误报告。