![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PHP XDEBUG 扩展 | 文档安装这个章节描述了如何安装 Xdebug 。 Windows 预编译模块这是一些 Windows 平台的预编译模块,都是针对 PHP 的非调试版本。你可以从下载页面获得他们。跟随这些说明去安装 Xdebug。 PECL 安装从 Xdebug 0.9.0 以上开始,你可以通过 PEAR/PECL 安装 Xdebug。这只能在 0.9.1-dev 及更高的版本的PEAR 版本,和一些 UNIX 中有效。 通过 PEAR/PECL 安装像这样简单: # pecl install xdebug 但是你仍然需要添加正确的代码行到你的 php.ini 文件:(不要忘记将其更改为正确的路径和文件名,并且确定使用的是全路径) zend_extension="/usr/local/php/modules/xdebug.so" 注意:你应该忽视任何添加 "extension=xdebug.so" 到 php.ini 的提示,这将会导致错误。 在 Mac Os X 系统下的安装PHP 已经可以从非官方的 Mac Os X 包管理器 Homebrew 上获得了。Homebrew 推荐使用 PECL 安装 xdebug,所以请按照上面的指示通过 PECL 安装。 从源代码安装你可以下载近期稳定的版本 2.7.2. 或者你可以从 GIT 获得 Xdebug : git clone git://github.com/xdebug/xdebug.git 这将检验最新的开发版本,目前是 2.7.2。你也可以浏览这里的资源 https://github.com/derickr/xdebug. 编译这是一个向导,可以给你提供下载正确的文件和使用路径。
编译 Xdebug 需要独立于 PHP 部分。注意,你需要访问 "phpize" 和 "php-config" 脚本。如果你的系统没有这两个脚本,你首先需要从源代码压缩包编译和安装 PHP,这两个脚本会是 PHP 编译和安装过程的产物。(Debian 用户可以通过
使用 Xdebug 配置 PHP
PHP 版本支持这张表列出了哪个 Xdebug 的版本仍然在支持,以及哪个版本能够支持更早的 PHP 版本。通常来说,一个 Xdebug 版本发行的任何时候,它都将会支持当前支持的 PHP 版本.
兼容性Xdebug 能和 Zend Opcache 一起工作,尽管功能有所减少,因为 Opcache 优化了信息以让 Xdebug 能够使用。 Xdebug 不能和其他 PHP 内部扩展(DBG,APD,ioncube 等等)一起工作。因为这些模块的兼容性问题。 安装 Debugclient解压 Xdebug 源代码压缩包,操作下面的命令: $ cd debugclient $ ./configure --with-libedit $ make # make install
除非系统中没有零件库编辑器(libedit),否则这将会安装 debugclient 二进制文件到 /usr/local/bin 中。你可以安装它,或者省去 "--with-libedit" 选项来配置。"不稳定的" Debian 用户可以通过 如果确定已经正确安装而配置脚本没有找到 libedit,将会在 configure.log 文件中得到像下面的链接错误: /usr/lib64/libedit.so: undefined reference to `tgetnum' /usr/lib64/libedit.so: undefined reference to `tgoto' /usr/lib64/libedit.so: undefined reference to `tgetflag' /usr/lib64/libedit.so: undefined reference to `tputs' /usr/lib64/libedit.so: undefined reference to `tgetent' /usr/lib64/libedit.so: undefined reference to `tgetstr' collect2: ld returned 1 exit status 需要更改配置命令为: $ LDFLAGS=-lncurses ./configure --with-libedit 变量显示特征Xdebug 替换了 PHP 的 var_dump() 函数来显示变量。受限于数组元素或对象属性的数量, Xdebug 的版本针对数组元素不同的类型和空间包含不同的颜色,也包含最大的深度和字符串长度。这里也有一些其他的函数处理变量的显示。 对 var_dump() 设置的影响这是一些控制 Xdebug 修改的 var_dump() 函数输出的设置:xdebug.var_display_max_children , xdebug.var_display_max_data 和 xdebug.var_display_max_depth 。下面这个示例很好的展示了这三个设置的影响。可以在表格中看到区别。 脚本
结果array 'one' => string 'a somewhat long string!' (length=23) 'two' => array 'two.one' => array 'two.one.zero' => int 210 'two.one.one' => array ... 'three' => object(test)[1] public 'pub' => &object(test)[1] private 'priv' => boolean true protected 'prot' => int 42 'four' => array 0 => int 0 1 => int 1 2 => int 2 3 => int 3 4 => int 4 5 => int 5 array 'one' => string 'a somewhat long string!' (length=23) 'two' => array 'two.one' => array 'two.one.zero' => int 210 'two.one.one' => array ... more elements... array 'one' => string 'a somewhat long '... (length=23) 'two' => array 'two.one' => array 'two.one.zero' => int 210 'two.one.one' => array ... 'three' => object(test)[1] public 'pub' => &object(test)[1] private 'priv' => boolean true protected 'prot' => int 42 'four' => array 0 => int 0 1 => int 1 2 => int 2 3 => int 3 4 => int 4 5 => int 5 array 'one' => string 'a somewhat long string!' (length=23) 'two' => array 'two.one' => array ... 'three' => object(test)[1] public 'pub' => &object(test)[1] private 'priv' => boolean true protected 'prot' => int 42 'four' => array 0 => int 0 1 => int 1 2 => int 2 3 => int 3 4 => int 4 5 => int 5 array 'one' => string 'a somewh'... (length=23) 'two' => array ... 'three' => object(test)[1] ... more elements... 相关设置xdebug.cli_color
类型:整数,默认值: 0, 由 Xdebug > 2.2 引入
如果这个设置为 1,当在 CLI 模式并且输出是一个终端(tty)时,Xdebug 将会给 var_dumps 和堆栈跟踪输出附上颜色。在 Windows 系统下,需要安装 ANSICON 工具。 如果设置为 2,无论是否连上了终端和 ANSICON 是否安装,Xdebug 都将会给 var_dumps 和堆栈跟踪输出附上颜色。在这种情况下将不会看到转义的代码。 看这篇文章了解更多信息。 xdebug.overload_var_dump
类型:布尔值,默认值: 2, 由 Xdebug > 2.1 引入
当 html_errors 在 php.ini 中设置为 你可以设置这个值为 在 Xdebug 2.4 之前,这个设置的默认值是 xdebug.var_display_max_children
类型:整数,默认值: 128
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制数组子元素和对象属性显示的数量。 设置值为 -1 ,可以取消显示的任何限制。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 xdebug.var_display_max_data
类型:整数,默认值: 512
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制显示的字符串的最大长度。 设置值为 -1 ,可以取消显示的任何限制。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 xdebug.var_display_max_depth
类型:整数,默认值: 3
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制数组子元素和对象属性嵌套多少层。 你可以选择的最大值是 1023 。你也可以使用 -1 作为值来选择这个最大的值。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 相关函数void var_dump( [mixed var [, ...]] )
显示变量的细节方面的信息
这个函数由 Xdebug 重载,看 xdebug_var_dump() 的描述。 void xdebug_debug_zval( [string varname [, ...]] )
显示一个变量的信息
这个函数显示一个或更多变量的结构化的信息,包含它的类型、值和引用信息。数组是递归性地探测值的。为了绕过变量本身实际上已经传递给了函数这个问题,这个函数的实现不同于 PHP 的 debug_zval_dump() 函数的实现。Xdebug 的版本更好是因为它使用这个变量名在内部符号表中查找这个变量,而且能直接访问所有的属性而不用实际地传递一个变量到函数来处理。结果是这个函数返回的信息比 PHP 自己的函数显示的容器信息更加准确。 从 Xdebug 2.3 开始支持除了简单变量名(例如下面的 "a[2]")之外的任何东西。 示例:
<?php 返回:
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)=1, 1 => (refcount=1, is_ref=0)=2, 2 => (refcount=2, is_ref=1)=3) a[2]: (refcount=2, is_ref=1)=3 void xdebug_debug_zval_stdout( [string varname [, ...]] )
返回一个变量标准输出的信息
这个函数显示一个或更多变量的结构化的信息,包含它的类型、值和引用信息。数组是递归性地探测值的。和 xdebug_debug_zval 不同的是这个信息不是通过网络服务器 API 层显示的,而是直接输出显示(所以当你用 Apache 单进程模式运行它,它在控制台结束)。 示例:
<?php 返回:
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)=1, 1 => (refcount=1, is_ref=0)=2, 2 => (refcount=2, is_ref=1)=3) void xdebug_dump_superglobals()
显示超级全局变量的信息
当这个设置设置为 示例:
xdebug.dump.GET=* 返回:
void xdebug_var_dump( [mixed var [, ...]] )
显示一个变量的详细信息
这个函数显示一个或更多变量的结构化的信息,包含它的类型、值和引用信息。数组是递归性地探测值的。查看变量显示特征的介绍,可以看到 php.ini 的设置如何影响这个函数。 示例:
<?php 返回:
array 0 => array 0 => boolean true 1 => int 2 2 => float 3.14 more elements... 'object' => object(stdClass)[1] public 'foo' => string 'bar' (length=3) public 'file' => resource(3, stream) 堆栈跟踪当 Xdebug 开启,无论 PHP 显示一个通知、警告或者错误,都将显示堆栈跟踪。堆栈跟踪的显示、显示的方式这些信息可以根据需要来配置。 在错误环境下(如果 disply_errors 在 php.ini 中设置),Xdebug 显示的错误堆栈跟踪在信息的数量上是相当保守的。这是因为大量的信息会让脚本的执行和把堆栈跟踪提供到浏览器上的速度减慢。然而用不同的设置让堆栈跟踪显示更多的细节信息是可以实现的。 堆栈跟踪中的变量Xdebug 默认会显示目前在堆栈跟踪中产生的变量信息。在变量信息收集或者展示时都会占据相当一部分资源。然而在很多情况下变量信息的显示是很有用的,这也是为什么 Xdebug 有这个设置 xdebug.collect_params 。下方的脚本显示了这个设置的不同值会产生怎样的输出。 脚本
结果不同的这个设置 xdebug.collect_params 的值产生不同的输出,可以看下面:
ini_set('xdebug.collect_params', '1');
ini_set('xdebug.collect_params', '2');
ini_set('xdebug.collect_params', '3');
ini_set('xdebug.collect_params', '4');
附加的信息在上面显示的传递到每个函数的变量值,Xdebug 可以使用 xdebug.dump_globals 和 xdebug.dump.* 设置来选择性的显示选中的超级全局变量信息。这个 xdebug.dump_once 和 xdebug.dump_undefined 设置能轻微的修改在可获得的超级全局变量中何时显示以及显示哪个信息。用这个设置 xdebug.show_local_vars 可以通知 Xdebug 在顶层堆栈中显示所有可获得的变量,针对用户自定义的函数也是如此。示例展示在这里(使用的脚本来自上一个示例)。
ini_set('xdebug.collect_vars', 'on'); ini_set('xdebug.collect_params', '4'); ini_set('xdebug.dump_globals', 'on'); ini_set('xdebug.dump.SERVER', 'REQUEST_URI');
ini_set('xdebug.collect_vars', 'on'); ini_set('xdebug.collect_params', '4'); ini_set('xdebug.dump_globals', 'on'); ini_set('xdebug.dump.SERVER', 'REQUEST_URI'); ini_set('xdebug.show_local_vars', 'on');
过滤Xdebug 2.6 引入了堆栈跟踪的过滤功能。过滤器可以通过白名单包含、黑名单排除路径和类名前缀。你可以使用过滤器阻止第三方扩展包目录出现在堆栈跟踪中,或者其中只包含特定的命名空间的类。 设置过滤器只展示函数和方法,或者以 "Xdebug" 为前缀,你可以调用 xdebug_set_filter(): 示例:
使用此过滤器设置,你将只看到以 "Xdebug" 开头的类调用的函数(没有类)和方法。这包括 PHP 内置的函数(比如 xdebug_set_filter() 的参数介绍的完整页面在其自己的文档页面。 相关的设置xdebug.cli_color
类型:整数,默认值: 0, 由 Xdebug > 2.2 引入
如果这个设置为 1,当在 CLI 模式并且输出是一个终端(tty)时,Xdebug 将会给 var_dumps 和堆栈跟踪输出附上颜色。在 Windows 系统下,需要安装 ANSICON 工具。 如果设置为 2,无论是否连上了终端和 ANSICON 是否安装,Xdebug 都将会给 var_dumps 和堆栈跟踪输出附上颜色。在这种情况下将不会看到转义的代码。 看这篇文章了解更多信息。 xdebug.collect_includes
类型:布尔值,默认值: 1
这个设置默认为 1,控制 Xdebug 是否应该在 include(),include_once(),require() 或者 require_once() 的文件跟踪中写入文件名。
xdebug.collect_params
类型:整数,默认值: 0
这个设置默认为 0,当一个函数被函数跟踪或堆栈跟踪记录时,控制 Xdebug 是否收集参数传递给函数。 设置默认为 0 是因为非常大型的脚本会消耗巨大的内存,因此这样能让大型脚本运行起来。除了在大量函数调用和(或者)大型数据结构作为参数的脚本,都能最大程度的的安全的开启这个设置。 Xdebug 2 增加内存消耗时不会有这个问题,因为它从不将信息储存在内存中。相反它只会写入磁盘中。这意味着你需要查看磁盘空间使用情况。 这个设置有 4 个不同的值。针对每个值会有不同的信息显示。下面你将会看到每个值提供的信息是什么。也可以看堆栈跟踪特征的介绍提供的一些屏幕截图。
1 在 PHP 的 CLI 版本中将不会有 the tool tip,在输出文件中也没有。 xdebug.collect_vars
类型:布尔值,默认值: 0
这个设置告诉 Xdebug 在一个确定的作用域中收集哪些变量信息。这个分析就和 Xdebug 需要反向设计 PHP 的操作码数组一样慢。这个设置将不会记录不同变量拥有哪些值,这种情况使用 xdebug.collect_params 。这个设置只有在你希望使用 xdebug_get_declared_vars() 时开启。
xdebug.dump.*
类型:字符串,默认值: Empty
* 可以是 COOKIE,FILES,GET,POST,REQUEST,SERVER,SESSION 中的任何值。这 7 个设置控制了当错误状况出现时超级全局变量中的哪个数据将会显示。 每一个 php.ini 中的设置可以由逗号分隔的变量目录组成来实现转储,其中变量来自这个超级全局变量数组,或者是 当错误出现为了转储 REMOTE_ADDR,REQUEST_METHOD 和所有 GET 参数,添加这些设置: xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD xdebug.dump.GET = * xdebug.dump_globals
类型:布尔值,默认值: 1
当这个设置设置为
true 时,通过 xdebug.dump.* 配置的超级全局变量,Xdebug 会添加到屏幕堆栈和错误日志(如果开启了错误日志)。xdebug.dump_once
类型:布尔值,默认值: 1
控制超级全局变量的值是在所有错误中(设置为 0)转储还是只在第一次错误中(设置为 1)转储。
xdebug.dump_undefined
类型:布尔值,默认值: 0
如果你想转储超级全局变量中未定义的值应该设置这个设置为 1,否则保留它设置为 0。
xdebug.file_link_format
类型:字符串,默认值: , 由 Xdebug > 2.1 引入
这个设置决定了在堆栈跟踪中显示文件名的链接形式。这允许 IDE 设置链接协议,通过点击 Xdebug 在堆栈跟踪中显示的文件名就能直接进入文件以及指定的行。格式会像这个示例: myide://%f@%l 可能的格式说明符:
针对不同的 IDE 或者 OS,这里是一些让其工作的说明清单: Firefox on Linux
Windows and netbeans
xdebug.filename_format
Type: string, 默认值: ...%s%n, 由 Xdebug >= 2.6 引入
这个设置决定了在 HTML 堆栈跟踪中 Xdebug 呈现的文件名(默认:
此表列出了可能的格式说明符。示例输出是根据全路径
xdebug.manual_url
类型:字符串,默认值:http://www.php.net, 由 Xdebug < 2.2.1 引入
这是函数跟踪和错误信息指向的手册页面链接的基准 URL。建议这个设置设为使用最近的镜像。
xdebug.show_error_trace
类型:整数,默认值: 0,由 Xdebug >= 2.4 引入
当这个设置设为 1,当错误发生时,即便这个错误已经被捕获,Xdebug 都将会显示堆栈跟踪。
xdebug.show_exception_trace
类型:整数,默认值:0
当这个设置设为 1,每当异常或错误发生,即便他们已经被捕获, Xdebug 都将会显示堆栈跟踪。
‘异常’错误在 PHP 7 中引入。 xdebug.show_local_vars
类型:整数,默认值:0
当这个设置设为其他不等于 0 的值时,错误状况下 Xdebug 生成的堆栈转储信息将会在顶层作用域显示所有的变量。注意这可能生成大量的信息,因此默认是关闭这个设置的。
xdebug.show_mem_delta
类型:整数,默认值:0
当这个设置设为其他不等于 0 的值时,Xdebug 会生成易于人类阅读的跟踪文件,将会向显示不同函数调用间内存使用的差异。如果 Xdebug 是配置为生成易于计算机阅读的跟踪文件则将会总是显示这个信息。
xdebug.var_display_max_children
类型:整数,默认值: 128
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制数组子元素和对象属性显示的数量。 设置值为 -1 ,可以取消显示的任何限制。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 xdebug.var_display_max_data
类型:整数,默认值: 512
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制显示的字符串的最大长度。 设置值为 -1 ,可以取消显示的任何限制。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 xdebug.var_display_max_depth
类型:整数,默认值: 3
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制数组子元素和对象属性嵌套多少层。 你可以选择的最大值是 1023 。你也可以使用 -1 作为值来选择这个最大的值。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 相关函数array xdebug_get_declared_vars()
返回声明的变量
返回一个数组,包含当前作用域中被声明的变量。这个设置需要 xdebug.collect_vars 来开启。 示例:
<?php 返回:
array 0 => string 'a' (length=1) 1 => string 'b' (length=1) 2 => string 'item' (length=4) 在 PHP 5.1 之前的版本中,变量名 "a" 不再返回到数组中,因为它不在函数 xdebug_get_declared_vars() 调用的作用域中。 array xdebug_get_function_stack()
返回堆栈的信息
返回一个类似于堆栈跟踪的数组。示例脚本: 示例:
<?php 返回:
array 0 => array 'function' => string '{main}' (length=6) 'file' => string '/var/www/xdebug_get_function_stack.php' (length=63) 'line' => int 0 'params' => array empty 1 => array 'function' => string 'fix_strings' (length=11) 'class' => string 'strings' (length=7) 'file' => string '/var/www/xdebug_get_function_stack.php' (length=63) 'line' => int 18 'params' => array 'b' => string 'array (0 => 'Derick')' (length=21) 2 => array 'function' => string 'fix_string' (length=10) 'class' => string 'strings' (length=7) 'file' => string '/var/www/xdebug_get_function_stack.php' (length=63) 'line' => int 12 'params' => array 'a' => string ''Derick'' (length=8) array xdebug_get_monitored_functions()
返回监控函数的信息
由 2.4 版本引入
返回一个数组结构,包含监控函数在脚本中哪里执行的信息。下面的示例展示了怎样使用它和返回的信息。 示例:
<?php 返回:
/tmp/monitor-example.php:10: array(2) { [0] => array(3) { 'function' => string(6) "strrev" 'filename' => string(24) "/tmp/monitor-example.php" 'lineno' => int(6) } [1] => array(3) { 'function' => string(6) "strrev" 'filename' => string(24) "/tmp/monitor-example.php" 'lineno' => int(8) } } integer xdebug_get_stack_depth()
返回当前堆栈的深度
返回堆栈的深度。脚本的主体 main{} 的深度为 0,每一个 inlcude 和 函数调用会让堆栈深度增加一级。 none xdebug_print_function_stack( [ string message [, int options ] ] )
显示当前函数的堆栈
以类似于 Xdebug 在错误状况下显示的方式来显示当前函数的堆栈。 "message" 参数允许用自己的头部信息来替换。(在 Xdebug 2.1 中引入) 示例:
<?php 返回:
位掩码 "options" 允许你配置一些额外的选项。下面的选项是目前支持的:
void xdebug_start_function_monitor( array $list_of_functions_to_monitor )
开启函数监控
由 2.4 版本引入
这个函数对函数参数语句中的函数条目开启了监控。函数监控允许找出作为参数的函数在代码中的哪里被调用了。这个可以用来跟踪在哪里使用了旧版本或不推荐的函数。 示例:
<?php 你也可以添加类方法和静态方法到数组中来定义哪些函数被监控。例如,捕获静态调用 DramModel::canSee 和 动态调用 Whisky->drink,你需要这样开启监控: 示例:
<?php 被定义的函数是大小写敏感的,一个静态方法的动态调用将不会被捕获。 void xdebug_stop_function_monitor()
停止监控函数
由 2.4 版本引入
这个函数停止函数监控。为了获得监控函数的清单,需要使用 xdebug_get_monitored_functions() 函数。 函数跟踪Xdebug 允许记录所有的函数调用,记录文件中包含不同格式的参数和返回值。 这里之所以叫 "函数跟踪" 是当你新建一个应用或尝试了解应用运行时具体是怎样进行的会有所帮助。函数跟踪可以选择性的显示传递到函数和方法的变量值以及返回值。默认跟踪中这两个元素是不可见的。 输出格式这里有三种输出格式。一种是供人类阅读的跟踪信息,另一种是更适用于计算机程序让其更容易解析,最后一种是使用 HTML 格式的跟踪信息。你可以使用设置 xdebug.trace_format 在两种不同的格式之间切换。这里的一些设置能控制哪些信息能被写入跟踪文件。示例中的设置包括变量 xdebug.collect_params 和 xdebug.collect_return 返回值。下面的示例展示了不同设置在供人类可读的函数跟踪中的影响。 脚本
结果下面是 xdebug.collect_params 设置不同的设置值的结果。因为这不是一个 web 环境,在文本文件中工具会提示不能工作,所以 2 的值没有任何意义。 TRACE START [2007-05-06 14:37:06] 0.0003 114112 -> {main}() ../trace.php:0 0.0004 114272 -> str_split() ../trace.php:8 0.0153 117424 -> ret_ord() ../trace.php:10 0.0165 117584 -> ord() ../trace.php:5 0.0166 117584 -> ret_ord() ../trace.php:10 0.0167 117584 -> ord() ../trace.php:5 0.0168 117584 -> ret_ord() ../trace.php:10 0.0168 117584 -> ord() ../trace.php:5 0.0170 117584 -> ret_ord() ../trace.php:10 0.0170 117584 -> ord() ../trace.php:5 0.0172 117584 -> ret_ord() ../trace.php:10 0.0172 117584 -> ord() ../trace.php:5 0.0173 117584 -> ret_ord() ../trace.php:10 0.0174 117584 -> ord() ../trace.php:5 0.0177 41152 TRACE END [2007-05-06 14:37:07] TRACE START [2007-05-06 14:37:11] 0.0003 114112 -> {main}() ../trace.php:0 0.0004 114272 -> str_split(string(6)) ../trace.php:8 0.0007 117424 -> ret_ord(string(1)) ../trace.php:10 0.0007 117584 -> ord(string(1)) ../trace.php:5 0.0009 117584 -> ret_ord(string(1)) ../trace.php:10 0.0009 117584 -> ord(string(1)) ../trace.php:5 0.0010 117584 -> ret_ord(string(1)) ../trace.php:10 0.0011 117584 -> ord(string(1)) ../trace.php:5 0.0012 117584 -> ret_ord(string(1)) ../trace.php:10 0.0013 117584 -> ord(string(1)) ../trace.php:5 0.0014 117584 -> ret_ord(string(1)) ../trace.php:10 0.0014 117584 -> ord(string(1)) ../trace.php:5 0.0016 117584 -> ret_ord(string(1)) ../trace.php:10 0.0016 117584 -> ord(string(1)) ../trace.php:5 0.0019 41152 TRACE END [2007-05-06 14:37:11] TRACE START [2007-05-06 14:37:13] 0.0003 114112 -> {main}() ../trace.php:0 0.0004 114272 -> str_split('Xdebug') ../trace.php:8 0.0007 117424 -> ret_ord('X') ../trace.php:10 0.0007 117584 -> ord('X') ../trace.php:5 0.0009 117584 -> ret_ord('d') ../trace.php:10 0.0009 117584 -> ord('d') ../trace.php:5 0.0010 117584 -> ret_ord('e') ../trace.php:10 0.0011 117584 -> ord('e') ../trace.php:5 0.0012 117584 -> ret_ord('b') ../trace.php:10 0.0013 117584 -> ord('b') ../trace.php:5 0.0014 117584 -> ret_ord('u') ../trace.php:10 0.0014 117584 -> ord('u') ../trace.php:5 0.0016 117584 -> ret_ord('g') ../trace.php:10 0.0016 117584 -> ord('g') ../trace.php:5 0.0019 41152 TRACE END [2007-05-06 14:37:13] TRACE START [2007-05-06 14:37:16] 0.0003 114112 -> {main}() ../trace.php:0 0.0004 114272 -> str_split('Xdebug') ../trace.php:8 0.0007 117424 -> ret_ord($c = 'X') ../trace.php:10 0.0007 117584 -> ord('X') ../trace.php:5 0.0009 117584 -> ret_ord($c = 'd') ../trace.php:10 0.0009 117584 -> ord('d') ../trace.php:5 0.0010 117584 -> ret_ord($c = 'e') ../trace.php:10 0.0011 117584 -> ord('e') ../trace.php:5 0.0012 117584 -> ret_ord($c = 'b') ../trace.php:10 0.0013 117584 -> ord('b') ../trace.php:5 0.0014 117584 -> ret_ord($c = 'u') ../trace.php:10 0.0014 117584 -> ord('u') ../trace.php:5 0.0016 117584 -> ret_ord($c = 'g') ../trace.php:10 0.0016 117584 -> ord('g') ../trace.php:5 0.0019 41152 TRACE END [2007-05-06 14:37:16] 除了 xdebug.collect_params 设置,还有其他设置编号会影响跟踪文件的输出。第一个 "default" 标签展示了如上面所示的默认情况。第二个标签 "show_mem_delta" 展示了在输出文件不同的两行之间的内存使用差异。 在 "collect_return=1" 标签上所有函数调用的返回值都是可见的。可以通过 xdebug.collect_return 设置来打开。 "collect_assignments=1" 标签会显示变量参数,这可以用 xdebug.collect_assignments 设置来打开。 最后一个标签展示了一种不同的输出格式,这更加容易解析但是阅读起来会更困难。如果有额外的工具来解释跟踪文件,那么 xdebug.trace_format 设置通常来说是非常有用的。 TRACE START [2007-05-06 14:37:06] 0.0003 114112 -> {main}() ../trace.php:0 0.0004 114272 -> str_split() ../trace.php:8 0.0153 117424 -> ret_ord() ../trace.php:10 0.0165 117584 -> ord() ../trace.php:5 0.0166 117584 -> ret_ord() ../trace.php:10 0.0167 117584 -> ord() ../trace.php:5 0.0168 117584 -> ret_ord() ../trace.php:10 0.0168 117584 -> ord() ../trace.php:5 0.0170 117584 -> ret_ord() ../trace.php:10 0.0170 117584 -> ord() ../trace.php:5 0.0172 117584 -> ret_ord() ../trace.php:10 0.0172 117584 -> ord() ../trace.php:5 0.0173 117584 -> ret_ord() ../trace.php:10 0.0174 117584 -> ord() ../trace.php:5 0.0177 41152 TRACE END [2007-05-06 14:37:07] TRACE START [2007-05-06 14:37:26] 0.0003 114112 +114112 -> {main}() ../trace.php:0 0.0004 114272 +160 -> str_split('Xdebug') ../trace.php:8 0.0007 117424 +3152 -> ret_ord($c = 'X') ../trace.php:10 0.0007 117584 +160 -> ord('X') ../trace.php:5 0.0009 117584 +0 -> ret_ord($c = 'd') ../trace.php:10 0.0009 117584 +0 -> ord('d') ../trace.php:5 0.0011 117584 +0 -> ret_ord($c = 'e') ../trace.php:10 0.0011 117584 +0 -> ord('e') ../trace.php:5 0.0013 117584 +0 -> ret_ord($c = 'b') ../trace.php:10 0.0013 117584 +0 -> ord('b') ../trace.php:5 0.0014 117584 +0 -> ret_ord($c = 'u') ../trace.php:10 0.0015 117584 +0 -> ord('u') ../trace.php:5 0.0016 117584 +0 -> ret_ord($c = 'g') ../trace.php:10 0.0017 117584 +0 -> ord('g') ../trace.php:5 0.0019 41152 TRACE END [2007-05-06 14:37:26] TRACE START [2007-05-06 14:37:35] 0.0003 114112 -> {main}() ../trace.php:0 0.0004 114272 -> str_split('Xdebug') ../trace.php:8 >=> array (0 => 'X', 1 => 'd', 2 => 'e', 3 => 'b', 4 => 'u', 5 => 'g') 0.0007 117424 -> ret_ord($c = 'X') ../trace.php:10 0.0007 117584 -> ord('X') ../trace.php:5 >=> 88 >=> 88 0.0009 117584 -> ret_ord($c = 'd') ../trace.php:10 0.0009 117584 -> ord('d') ../trace.php:5 >=> 100 >=> 100 0.0011 117584 -> ret_ord($c = 'e') ../trace.php:10 0.0011 117584 -> ord('e') ../trace.php:5 >=> 101 >=> 101 0.0013 117584 -> ret_ord($c = 'b') ../trace.php:10 0.0013 117584 -> ord('b') ../trace.php:5 >=> 98 >=> 98 0.0015 117584 -> ret_ord($c = 'u') ../trace.php:10 0.0016 117584 -> ord('u') ../trace.php:5 >=> 117 >=> 117 0.0017 117584 -> ret_ord($c = 'g') ../trace.php:10 0.0018 117584 -> ord('g') ../trace.php:5 >=> 103 >=> 103 >=> 1 0.0021 41152 TRACE END [2007-05-06 14:37:35] Version: 2.0.0RC4-dev TRACE START [2007-05-06 18:29:01] 1 0 0 0.010870 114112 {main} 1 ../trace.php 0 2 1 0 0.032009 114272 str_split 0 ../trace.php 8 2 1 1 0.032073 116632 2 2 0 0.033505 117424 ret_ord 1 ../trace.php 10 3 3 0 0.033531 117584 ord 0 ../trace.php 5 3 3 1 0.033551 117584 2 2 1 0.033567 117584 2 4 0 0.033718 117584 ret_ord 1 ../trace.php 10 3 5 0 0.033740 117584 ord 0 ../trace.php 5 3 5 1 0.033758 117584 2 4 1 0.033770 117584 2 6 0 0.033914 117584 ret_ord 1 ../trace.php 10 3 7 0 0.033936 117584 ord 0 ../trace.php 5 3 7 1 0.033953 117584 2 6 1 0.033965 117584 2 8 0 0.034108 117584 ret_ord 1 ../trace.php 10 3 9 0 0.034130 117584 ord 0 ../trace.php 5 3 9 1 0.034147 117584 2 8 1 0.034160 117584 2 10 0 0.034302 117584 ret_ord 1 ../trace.php 10 3 11 0 0.034325 117584 ord 0 ../trace.php 5 3 11 1 0.034342 117584 2 10 1 0.034354 117584 2 12 0 0.034497 117584 ret_ord 1 ../trace.php 10 3 13 0 0.034519 117584 ord 0 ../trace.php 5 3 13 1 0.034536 117584 2 12 1 0.034549 117584 1 0 1 0.034636 117584 TRACE END [2007-05-06 18:29:01] VIM 语法文件Xdebug 附带了能高亮跟踪文件语法的 VIM 语法文件: xt.vim。为了让 VIM 识别新的格式需要执行下面的步骤:
这些设置能让一个打开的跟踪文件像这样: TRACE START [2007-05-15 20:06:02] 0.0003 115208 -> {main}() ../trace.php:0 0.0004 115368 -> str_split() ../trace.php:8 0.0006 118520 -> ret_ord() ../trace.php:10 0.0007 118680 -> ord() ../trace.php:5 0.0008 118680 -> ret_ord() ../trace.php:10 0.0009 118680 -> ord() ../trace.php:5 0.0010 118680 -> ret_ord() ../trace.php:10 0.0010 118680 -> ord() ../trace.php:5 0.0012 118680 -> ret_ord() ../trace.php:10 0.0012 118680 -> ord() ../trace.php:5 0.0014 118680 -> ret_ord() ../trace.php:10 0.0014 118680 -> ord() ../trace.php:5 0.0016 118680 -> ret_ord() ../trace.php:10 0.0016 118680 -> ord() ../trace.php:5 0.0019 54880 TRACE END [2007-05-15 20:06:02] 折叠也能生效,可以使用 zc 和 zo 来折叠部分跟踪文件。 相关设置xdebug.auto_trace
类型:布尔值,默认值: 0
当这个设置开启时,在脚本运行之前函数的跟踪调用将会开启。在 auto_prepend_file 中能实现跟踪代码。
xdebug.collect_assignments
类型:布尔值,默认值: 0, 由 Xdebug > 2.1 引入
这个设置默认为 0,控制 Xdebug 是否应该添加变量语句到函数跟踪中。 从 Xdebug 2.6 起,也包括变量赋值 ( xdebug.collect_includes
类型:布尔值,默认值: 1
这个设置默认为 1,控制 Xdebug 是否应该在 include(),include_once(),require() 或者 require_once() 的文件跟踪中写入文件名。
xdebug.collect_params
类型:整数,默认值: 0
这个设置默认为 0,当一个函数被函数跟踪或堆栈跟踪记录时,控制 Xdebug 是否收集参数传递给函数。 设置默认为 0 是因为非常大型的脚本会消耗巨大的内存,因此这样能让大型脚本运行起来。除了在大量函数调用和(或者)大型数据结构作为参数的脚本,都能最大程度的的安全的开启这个设置。 Xdebug 2 增加内存消耗时不会有这个问题,因为它从不将信息储存在内存中。相反它只会写入磁盘中。这意味着你需要查看磁盘空间使用情况。 这个设置有 4 个不同的值。针对每个值会有不同的信息显示。下面你将会看到每个值提供的信息是什么。也可以看堆栈跟踪特征的介绍提供的一些屏幕截图。
1 在 PHP 的 CLI 版本中将不会有工具提示,在输出文件中也没有。 xdebug.collect_return
类型:布尔值,默认值: 0
设置默认为 0,控制 Xdebug 是否应该将函数调用的返回值写入跟踪文件。 对于计算机的跟踪文件 (xdebug.trace_format=1) 仅仅只从 Xdebug 2.3 开始工作。 xdebug.show_mem_delta
类型:整数,默认值:0
当这个设置设为其他不等于 0 的值时,Xdebug 会生成易于人类阅读的跟踪文件,将会向显示不同函数调用间内存使用的差异。如果 Xdebug 是配置为生成易于计算机阅读的跟踪文件则将会总是显示这个信息。
xdebug.trace_enable_trigger
类型:布尔值,默认值: 0, 由 Xdebug > 2.2 引入
当这个设置设为 1,可以通过使用 XDEBUG_TRACE GET/POST 参数或者设置一个名为 XDEBUG_TRACE 的会话来触发生成跟踪文件。这将会把跟踪数据写入定义的目录。为了阻止 Xdebug 为每一个请求都生成跟踪文件,你需要设置 xdebug.auto_trace 为 0。可以通过配置 xdebug.trace_enable_trigger_value 来访问触发器本身。
xdebug.trace_enable_trigger_value
类型:字符串,默认值: "", 由 Xdebug >= 2.2 引入
这个设置可以用来限制在 xdebug.trace_enable_trigger 中谁能利用 XDEBUG_TRACE 功能进行概括。当将它的默认值更改为空字符串时,cookie 的值、GET 或者 POST 参数需要匹配设置在这个设置中的秘钥才能生成跟踪文件
xdebug.trace_format
类型:整数,默认值: 0
跟踪文件的格式:
计算机格式的字段:
查看函数跟踪的介绍的一些示例。 xdebug.trace_options
类型:整数,默认值: 0
当设置为 1,后续请求生成的跟踪文件将被追加而不是改写。
xdebug.trace_output_dir
类型:字符串,默认值: /tmp
跟踪文件将会被写入的目录,需要确保运行 PHP 的用户有权限对这个目录进行写入。
xdebug.trace_output_name
类型:字符串,默认值: trace.%c
这个设置决定了用来转储跟踪信息的文件名。这个设置指定了格式化说明符的格式,非常类似于 sprintf() 和 strftime()。这里有几个格式化说明符可以用来格式化文件名。".xt" 扩展总是会自动添加上。 可能的格式化说明符有:
2 针对跟踪文件名,只有从 Xdebug 2.6 起这个才有效。 3 版本 2.2 中的新增。这个可以通过 Apache 的 mod_unique_id 模式 修改。 xdebug.var_display_max_children
类型:整数,默认值: 128
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制数组子元素和对象属性显示的数量。 设置值为 -1 ,可以取消显示的任何限制。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 xdebug.var_display_max_data
类型:整数,默认值: 512
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制显示的字符串的最大长度。 设置值为 -1 ,可以取消显示的任何限制。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 xdebug.var_display_max_depth
类型:整数,默认值: 3
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制数组子元素和对象属性嵌套多少层。 你可以选择的最大值是 1023 。你也可以使用 -1 作为值来选择这个最大的值。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 相关函数string xdebug_get_tracefile_name()
返回函数跟踪的文件名
返回用来跟踪脚本输出的文件名。当 xdebug.auto_trace 开启时这个设置很有用。 string xdebug_start_trace( [ string trace_file [, integer options] ] )
开启一个新的函数跟踪
开启从该函数到 trace_file 参数的文件的跟踪。如果没有函数名指定,那么跟踪文件将会被配置 xdebug.trace_output_dir 设置中的目录替代。 如果文件名作为第一个参数给出,则名字是针对当前工作目录的相对路径。这个当前工作目录可能不同于你所期望的,所以如果要指定一个文件名请使用一个绝对路径。可以使用 PHP 的 getcwd() 函数来计算出当前工作目录是什么。 跟踪文件的名字是 "{trace_file}.xt"。如果 xdebug.auto_trace 开启,那么 "{trace_file}.xt" 在 "{trace_file}" 部分的格式会取决于 xdebug.trace_outpuut_name 的设置。这个 options 是一个位字段,目前有这几种选项:
这个函数会返回 Xdebug 跟踪的文件名和全路径。这可能会是你传递的文件名(潜在的添加 ".xt"),如果没有文件名传递进去就会是自动生成的文件名。 string xdebug_stop_trace()
停止当前函数跟踪
停止跟踪函数调用,关闭跟踪文件。 函数返回跟踪被写入的文件的文件名 profiling PHP 脚本Xdebug 内置 profiler 可以找到脚本中的瓶颈,可以用诸如 KCacheGrind 或者 WinCacheGrind 这样的外部工具来让其方便人类阅读。 说明xdebug 的 profiler 是一个强大的工具,它能分析 PHP 代码,探测瓶颈,或者通常意义上来说查看哪部分代码运行缓慢以及可以提升速度。从 Xdebug 2.6 起,profiler 也能收集使用了多少内存和哪个函数或方法加剧了内存使用的信息。 Xdebug 分析器输出一种兼容 cachegrind 文件格式的分析信息。这允许你能使用出色的 KCacheGrind 工具(Linux,KDE)来分析你的 profiling 数据。在 Linux 可以使用你最喜欢的包管理器安装 KCacheGrind。 在 Windows 系统上,有预编译的 QCacheGrind 二进制程序(QCacheGrind 是没有 KDE 绑定的 KCacheGrind)。 在 Mac OSX 系统上,这里也有怎样安装 QCacheGrind 的说明。 Windows 用户可以选择性的使用 WinCacheGrind。它的功能不同于 KCacheGrind,所以 这个页面的 KCacheGrind 使用文档章节不适用于这个程序。WinCacheGrind 目前不支持 Xdebug 2.3 引入的 cachegrind 格式的文件和函数压缩。 这也有一种可替代 profile 信息演示的工具叫做 xdebugtoolkit,一款基于 web 前端的叫做 Webgrind,和一款基于 java 的工具叫做 XCallGraph。 如果你不能使用 KDE(或者不想使用 KDE)的 kcachegrind 包,可以用 perl 脚本 "ct_annotate",它能从分析器跟踪文件生成 ASCII 输出。 开启 profilerprofiling 开启是在 php.ini 中通过设置 xdebug.profiler_enable 设为 1 来完成。这指示 Xdebug 开始写入效能分析信息到 xdebug.profiler_output_dir 指令配置的转储目录中。生成的文件名总是以 "cachegrind.out" 开头,以 PHP(或者 Apache)进程的 PID(进程 ID)或者包含初始调试脚本的目录的 crc32 哈希码结尾。需要确保在 xdebug.profiler_output_dir 中有足够的空间,因为一个复杂脚本 profiler 生成的信息数量是巨大的,比如一个像 eZ Publish 的复杂应用能高达 500M。 你也可以通过将设置 xdebug.profiler_enable_trigger 设为 1 选择性的使用 profiler。如果它被设为 1,那么可以通过 XDEBUG_PROFILE 名字的 GET/POST 或者 COOKIE 变量来使用 profiler。Firefox 2 扩展也可以通过这个设置来使用调试器(查看 HTTP 调试会话)。为了让触发器能正常工作, xdebug.profiler_enable 需要被设置为 0. 从 Xdebug 2.6 开始,在被分析的请求上 Xdebug 添加了 HTTP 头部 分析 profiles在一个效能信息文件生成之后可以使用 KCacheGrind 打开它: 一旦打开了文件,在 KCacheGrind 不同的面板上可以得到大量信息。在左侧可以找到 "Flat Profile" 面板,它显示了脚本中按花费的时间进行排序的所有函数,以及它所有的子单元。
右边的面板包含一个上部和下部窗格。上边显示了哪个函数调用了当前指定的函数的信息
("eztemplatedesignresource->executecompiledtemplate in the screenshot)。
在上部的面板中 "Cost" 栏显示了在当前指定的函数中当从函数列表中被调用时所花费的时间。Cost 栏的数字合计总是 100%。下部面板中 "Cost" 栏显示了当从列表中调用这个函数所花费的时间。当统计这里列表里的数字,高概率的不能达到 100% ,因为指定的函数本身也需要花费时间来执行。
相关设置xdebug.profiler_aggregate
类型:整数,默认值: 0
当这个设置设为 1,将为多个请求编写单个分析文件。可以浏览多个页面或者重新加载页面以获得所有请求的平均值。这个文件将会命名为
.cachegrind.aggregate 。 你需要移动这个文件以获得另一轮聚合数据。xdebug.profiler_append
类型:整数,默认值: 0
如果这个设置设为 1,当一个新的请求映射到相同的文件(取决于 xdebug.profiler_enable_output_name 的设置)时 profiler 文件将不会被覆盖。反而新的 profile 将会被追加到文件中。
xdebug.profiler_enable
类型:整数,默认值: 0
开启 Xdebug 的 profiler 将会在 profile_output_directory 中创建文件。这些文件可以被 KCacheGrind 读取为可视化的数据。这个设置不能在脚本的 ini_set() 中设置。如果你想选择性的开启 profiler,请设置 xdebug.profiler_enable_trigger 为 1,而不是使用这个设置。
xdebug.profiler_enable_trigger
类型:整数,默认值:0
当这个设置设置为 1,通过使用 XDEBUG_PROFILE GET/POST 参数或者设置一个名 XDEBUG_PROFILE 的 cookie 将会触发生成 profiler 文件。这将会把 profiler 数据写入定义的目录。为了阻止 profiler 为每一个请求都生成 profile 文件,你需要设置 xdebug.profiler_enable 为 0。可以通过配置 xdebug.profiler_enable_trigger_value 来访问触发器本身。
xdebug.profiler_enable_trigger_value
类型:字符串,默认值: "", 由 Xdebug > 2.3 引入
这个设置可以用来限制在 xdebug.profiler_enable_trigger 中谁能利用 XDEBUG_PROFILE 功能进行概括。当将它的默认值更改为空字符串时,cookie 的值、GET 或者 POST 参数需要匹配设置在这个设置中的秘钥才能开启 profiler。
xdebug.profiler_output_dir
类型:字符串,默认值: /tmp
profiler 输出所在的这个目录将会被写入,需要确保运行 PHP 的用户有权限对这个目录进行写入。这个设置不能在脚本的 ini_set() 中设置。
xdebug.profiler_output_name
类型:字符串,默认值: cachegrind.out.%p
这个设置决定了用来转储跟踪信息的文件名。这个设置指定了格式化说明符的格式,非常类似于 sprintf() 和 strftime()。这里有几个格式化说明符可以用来格式化文件名。 查看 xdebug.trace_output_name 文档支持的说明符。 相关函数远程调试Xdebug 为调试客户端提供了一个运行 PHP 脚本的交互接口。这个章节说明了如何设置 PHP 和 Xdebug 来实现它,并介绍了一些客户端。 说明Xdebug (远程)调试器允许你检查数据结构,交互地遍历和调试你的代码。这个协议的使用是公开的,叫做 DBGp。这个协议是在 Xdebug 2 中实现的,它取代了旧版本的不再被支持的 GBD 协议。 客户端Xdebug 2 为了 DBGp 协议绑定了一个简单的命令行客户端。这里也有其他客户端(免费的和商业的)的实现。我不是任何一个的作者,所以请参考原作者的支持:
一个用来调试的简单命令行客户端是在 开启调试器为了使用 Xdebug 调试器,需要在 php.ini 中做一些配置设置。这些设置是 xdebug.remote_enable 用来开启调试器,xdebug.remote_host 和 xdebug.remote_port 用来配置调试器需要连接的 IP 地址和端口。如果开发中的服务器是多个开发者共享的,这里也有一个 xdebug.remote_connect_back 设置可以使用。 当错误状况出现时(PHP 错误或者异常),如果你想调试器初始化一个会话,那么需要更改 xdebug.remote_mode 设置。这个设置允许的值是 "req"(默认),只要当一个脚本启动它就能让调试器初始化一个会话,或者是 "jit",当有错误时会话才能被初始化。 在这些设置之后,当脚本运行 Xdebug 仍然不能自动的开启一个调试会话。你需要激活 Xdebug 调试器,有这三种方法可做:
在开启脚本之前需要告诉客户端它可以接收调试连接了,请参考指定客户端如何操作的文档。在编译和安装之后为了使用绑定的客户端简单的开启它,需要运行 "debugclient" 。 当 debugclient 开启会显示下面的信息然后等待一个连接被调试服务器初始化: Xdebug Simple DBGp client (0.10.0) Copyright 2002-2007 by Derick Rethans. - libedit support: enabled Waiting for debug server to connect. 在一个连接完成之后,调试服务器的输出显示为: Connect <?xml version="1.0" encoding="iso-8859-1"?> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///home/httpd/www.xdebug.org/html/docs/index.php" language="PHP" protocol_version="1.0" appid="13202" idekey="derick"> <engine version="2.0.0RC4-dev"><![CDATA[Xdebug]]></engine> <author><![CDATA[Derick Rethans]]></author> <url><![CDATA[http://xdebug.org]]></url> <copyright><![CDATA[Copyright (c) 2002-2007 by Derick Rethans]]></copyright> </init> (cmd) 现在可以如 DBGp 文档页面所说明的一样使用指令集。当脚本结束,调试服务器断开了来自客户端的连接,debugclient 会继续等待下一个新的连接。 通信设置一个静态 IP/单个开发者在远程调试中,Xdebug 内嵌于 PHP 中表现得像客户端和作为服务器的 IDE。下面的动画展示了通信信道是如何设置的:
一个未知 IP/多个开发者如果 zdebug.remote_connect_back 被使用,设置会略有不同:
HTTP 调试会话Xdebug 包含跟踪一个通过浏览器 cookie 开启的调试会话的功能。这像这样工作:
多用户调试当远程调试时,Xdebug 只允许指定一个 IP 地址连接到 xdebug.remote_host。它不会自动连接到浏览器运行的本机 IP 地址,除非使用 xdebug.remote_connect_back. 如果所有开发者不同的项目工作在同一台(开发阶段)服务器上,可以通过 Apache 的 .htaccess 功能使用 这个问题有两种解决方案。首先,可以使用 DBGp 代理。概述如何使用这个代理,请参考多用户调试的文章。你可以下载 ActiveState 网站上的代理服务器作为 python 远程调试包的一部分。这里有更多的文档 Komodo FAQ。 其次你可以使用由 Xdebug 2.1 引入的 xdebug.remote_connect_back 设置。 实施细则
Xdebug DBGp 协议的 定制 DBGp 命令
DBGp 协议允许调试器引擎指定前缀为 DBGp: xcmd_profiler_name_get如果 Xdebug 的 profiler 当前处于活跃状态(查看 Profiling PHP 脚本),这个命令返回正在被写入 profiling 信息的文件名。 DBGp: xcmd_get_executable_lines
这个命令返回在活跃的堆栈框架中哪些行可以具有工作断点。这些是在它们上面有 这个命令返回如下 XML 格式的信息: <?xml version="1.0" encoding="iso-8859-1"?> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="xcmd_get_executable_lines" transaction_id="10"> <xdebug:lines> <xdebug:line lineno="2"></xdebug:line> <xdebug:line lineno="3"></xdebug:line> <xdebug:line lineno="4"></xdebug:line> <xdebug:line lineno="6"></xdebug:line> <xdebug:line lineno="8"></xdebug:line> </xdebug:lines> </response> 相关设置xdebug.extended_info
类型:整数,默认值: 1
控制是否让 Xdebug 强制 PHP 解析器开启 "extended_info" 模式,它允许 Xdebug 在远程调试器中执行文件或行断点。当跟踪或者 profiling 脚本时通常应该关闭这个选项,因为 PHP 生成的 oparray 将会增加从而让脚本变慢。这个设置不能在脚本中用 ini_set() 设置,只能在 php.ini 中设置。
xdebug.idekey
类型:字符串,默认值: *complex*
控制哪一个 IDE 键应该传递到 DBGp 调试处理器上,默认是基于环境设置的。首先是考虑环境设置 DBGP_IDEKEY,然后是 USER,最后是 USERNAME。默认设置为找到的第一个环境变量。如果默认为空则一个都找不到。如果这个设置设置了,它将总是会覆盖环境变量。
xdebug.remote_addr_header
类型:字符串,默认值: "", 由 Xdebug > 2.4 引入
如果 xdebug.remote_addr_header 配置为非空字符串,那么该值将用作超全局数组 $SERVER 中的键,来确定哪个头部来查找用于连接的 IP 地址或主机名。这个设置只能与 xdebug.remote_connect_back 结合使用,否则将被忽略
xdebug.remote_autostart
类型:布尔值,默认值: 0
通常来说你需要使用一个指定的 HTTP GET/POST 变量来开启远程调试(查看远程调试)。当这个设置设为 1 时,即便 HTTP GET/POST 变量不存在,Xdebug 也将总是尝试开启一个远程调试会话并且设法连接到一个客户端。
xdebug.remote_connect_back
类型:布尔值,默认值: 0, 由 Xdebug > 2.1 引入
如果开启,xdebug.remote_host 设置将会被忽略,并且 Xdebug 将会让 HTTP 请求设法连接到客户端。它会检查 $_SERVER['REMOTE_ADDR'] 变量来寻找哪个 IP 地址可以使用。 如果配置了 xdebug.remote_addr_header ,那么将在 $_SERVER['HTTP_X_FORWARDED_FOR'] 和 $_SERVER['REMOTE_ADDR'] 变量之前检查 具有配置名称的 $SERVER 变量。 这个设置不适用于通过 CLI 调试,因为 $SERVER 头部变量在这里不可用。 请注意这里没有过滤变量,即使它的地址不能匹配 xdebug.remote_host,任何人也都能连接到网络服务器然后开启一个调试会话。 xdebug.remote_cookie_expire_time
类型:整数,默认值: 3600, 由 Xdebug > 2.1 引入
这个设置可以通过会话 cookie 增加(或减少)远程调试会话保持活跃的时间。
xdebug.remote_enable
类型:布尔值,默认值:0
这个开关控制 Xdebug 是否应该连接一个调试客户端来监听用 xdebug.remote_host 和 xdebug.remote_port 设置的主机和端口。如果一个连接不能被建立,脚本只将会像这个设置为 0 一样去继续运行。
xdebug.remote_handler
类型:字符串,默认值:dbgp
也可以为 "php3",这将选择旧版本的 PHP 的 3 种调试器输出。"gdb" 会开启像调试器接口的 GDB,或者是 "dbgp" —调试器协议。DBGp 协议是唯一支持的协议。 注意: Xdebug 2.1 和以后的版本仅支持 "dbgp" 作为协议。 xdebug.remote_host
类型:字符串,默认值:localhost
选择调试客户端在哪里运行,可以使用主机名或者 IP 地址。如果 xdebug.remote_connect_back 开启这个设置会被忽略。
对 Unix 域套接字支持由 Xdebug 2.6 引入。 xdebug.remote_log
类型:字符串,默认值:
如果设置了一个值,这将作为所有远程调试器通信记录的文件的名字。这个文件总是以 append-mode 打开,因此默认是不能被重写的。这里没有可用的并发保护。文件的格式像这样:
Log opened at 2007-05-27 14:28:15 -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/x ... ight></init> <- step_into -i 1 -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/db ... ></response> xdebug.remote_mode
类型:字符串,默认值: req
当一个调试连接初始化时选择。这个设置有两种不同的值:
xdebug.remote_port
类型:整数,默认值: 9000
Xdebug 尝试连接远程主机的端口。针对客户端和绑定的 debugclient,端口 9000 都是默认值。因为很多客户端使用的这个端口数,最好保持这个设置不要更改。
xdebug.remote_timeout
类型: 整型,默认值:200,由 Xdebug >= 2.6 引入
Xdebug 在 IDE 上等待确认传入调试连接以毫秒表示的时间量。默认值 200 毫秒在绝大多数情况下应该是足够的。如果你经常遇到调试请求丢失,可能是因为你有一个高延迟的网络,或者远离 IDE 的开发盒,或者防火墙速度慢,那么你可以增加此值。 请注意,增加此值可能意味着以防 Xdebug 尝试建立连接请求看似“挂起”,但是 IDE 没有在监听。 相关函数bool xdebug_break()
发送一个断点到调试客户端
这个函数能让调试器在特定的行中断,就像一个普通文件/行断点被设置在该行一样。 bool xdebug_is_debugger_active()
返回调试会话是否活跃
由 2.6 版本引入
如果通过 DBGPS 的调试会话,与客户端连接当前处于活跃状态,则返回 代码覆盖分析代码分析能够告诉你在一个请求中脚本中的哪一行(或者脚本的设置)被执行了。比如利用这个信息你可以发现你的单元测试的好坏程度。 Xdebug 的代码覆盖功能经常和 PHP_CodeCoverage 结合使用,用做 PHPUnit 运行的一部分。PHPUnit 将代码覆盖率收集委托给 Xdebug。它通过 xdebug_start_code_coverage() 和 xdebug_stop_code_coverage() 为每个测试开启和停止代码覆盖,使用 xdebug_get_code_coverage() 来取出结果。 代码覆盖的主要输出是一个数组,详细说明在运行代码覆盖集合活跃的代码时,哪些文件哪些行被“击中”。 但代码覆盖功能还可以在产生额外性能影响的情况下,分析哪些代码行上有可执行代码,哪些代码行实际可以被命中(无用代码分析),还可以进行检测以找出函数和方法中的哪些分支和路径被追踪。xdebug_start_code_coverage() 函数记录了各种选项。 过滤
Xdebug 2.6 引入了代码覆盖的过滤功能。使用过滤器在代码覆盖率收集期间你可以通过白名单包括,或通过黑名单排除,被分析的路径或类名前缀。一个典型的用例是将过滤器配置为只包含 过滤器的工作原理是根据配置的过滤器标记每个可执行单元(函数,方法,文件)。 Xdebug 只在特定可执行单元第一次被 include/require 时才这样做,因为 PHP 第一次解析和编译一个文件时才会发生过滤。 Xdebug 需要在这时这样做,也是因为当这时它会分析哪些路径能运行,可执行单元的哪些行不能执行。在这时标记可执行单元,也意味着比如 Xdebug 想要计算包含在代码覆盖中的行时不必每一次运行过滤器。 因此,在代码被 include/require 之前设置过滤器非常重要。目前最好使用 PHP 的 auto_prepend_file 设置通过自动前置文件来完成。
设置过滤器只展示 示例:
设置这个过滤器后,代码覆盖率信息将只包含位于 php -dauto_prepend_file=xdebug_filter.php yourscript.php 或者结合 PHPUnit,当通过 Composer 安装时,使用: php -dauto_prepend_file=xdebug_filter.php vendor/bin/phpunit xdebug_set_filter() 参数介绍的完整文档在其自己的文档页面。 相关设置xdebug.coverage_enable
类型:布尔值,默认值: 1, 由 Xdebug >= 2.2 引入
如果这个设置设置为 0,那么 Xdebug 将不会设置内部结构来允许代码覆盖。这能让 Xdebug 速度加快一点,但是代码覆盖率分析将不会工作。
相关函数boolean xdebug_code_coverage_started()
返回代码覆盖是否活跃
返回代码覆盖是否已经开启。 示例:
<?php 返回:
bool(false) bool(true) array xdebug_get_code_coverage()
返回代码覆盖信息
返回一个数组结构,包含哪些行在脚本中(包括 inlcude 的文件)被执行了的信息。下面的示例展示了一个指定文件的代码覆盖: 示例:
<?php 返回:
array '/home/httpd/html/test/xdebug/docs/xdebug_get_code_coverage.php' => array 5 => int 1 6 => int 1 7 => int 1 9 => int 1 10 => int 1 11 => int 1 12 => int 1 13 => int 1 15 => int 1 16 => int 1 18 => int 1 void xdebug_set_filter( int $group, int $list_type, array $configuration )
设置过滤器
由 2.6 版本引入
当展示堆栈跟踪或者记录函数跟踪时,或者当收集代码覆盖时,这个函数配置 Xdebug 使用的过滤器。过滤器配置应用于每个独立的执行单元(函数,方法,脚本主体)。
第一个参数,
你可以设置不同类型的过滤器。对于文件路径或完全限定类名,有一个白名单和黑名单选项。
用做第二个参数 "
不能同时配置黑名单和白名单,或者为路径和命名空间配置黑名单/白名单。 在任意的一个时间,四种列出的类型中只有一种能活跃。但是可以使用
排除跟踪 示例:
<?php
包含跟踪中的函数调用(不在类名之下), 示例:
<?php
只在 示例:
<?php void xdebug_start_code_coverage( [int options] )
开启代码覆盖
这个函数开始统计代码覆盖的信息。这个信息由二维数组组成,数组主下标是执行的文件名字,第二个索引是行号。返回的值代表代码行是否已经执行或者是不可执行的代码行。 每一行返回的值:
-1 只有在 XDEBUG_CC_UNUSED 开启时会返回,值 -2 只有在 XDEBUG_CC_UNUSED 和 XDEBUG_CC_DEAD_CODE 都开启时才会返回。
这个函数有两个选项,他们是位字段:
可以像下面示例中展示的一样使用这个选项。 示例:
<?php void xdebug_stop_code_coverage( [int cleanup=1] )
停止代码覆盖
这个函数会停止收集信息,内存中的信息将会被销毁。如果传递 0 作为参数,那么代码覆盖将不会被销毁,以至于可以再次使用 xdebug_start_code_coverage() 函数来继续收集信息。 FAQ常见问题 XDEBUG 使用
编译和配置
如果上面两处编号不匹配,那么你是使用了错误的头部在编译。参考下一个FAQ 条目来找出使用哪一个 phpize。 引用相关设置xdebug.auto_trace
类型:布尔值,默认值: 0
当这个设置开启时,在脚本运行之前函数的跟踪调用将会开启。在 auto_prepend_file 中能实现跟踪代码。
xdebug.cli_color
类型:整数,默认值: 0, 由 Xdebug > 2.2 引入
如果这个设置为 1,当在 CLI 模式并且输出是一个终端(tty)时,Xdebug 将会给 var_dumps 和堆栈跟踪输出附上颜色。在 Windows 系统下,需要安装 ANSICON 工具。 如果设置为 2,无论是否连上了终端和 ANSICON 是否安装,Xdebug 都将会给 var_dumps 和堆栈跟踪输出附上颜色。在这种情况下将不会看到转义的代码。 看这篇文章了解更多信息。 xdebug.collect_assignments
类型:布尔值,默认值: 0, 由 Xdebug >= 2.1 引入
这个设置默认为 0,控制 Xdebug 是否应该添加变量语句到函数跟踪中。 从 Xdebug 2.6 起,也包括变量赋值 ( xdebug.collect_includes
类型:布尔值,默认值: 1
这个设置默认为 1,控制 Xdebug 是否应该在 include(),include_once(),require() 或者 require_once() 的文件跟踪中写入文件名。
xdebug.collect_params
类型:整数,默认值: 0
这个设置默认为 0,当一个函数被函数跟踪或堆栈跟踪记录时,控制 Xdebug 是否收集参数传递给函数。 设置默认为 0 是因为非常大型的脚本会消耗巨大的内存,因此这样能让大型脚本运行起来。除了在大量函数调用和(或者)大型数据结构作为参数的脚本,都能最大程度的的安全的开启这个设置。 Xdebug 2 增加内存消耗时不会有这个问题,因为它从不将信息储存在内存中。相反它只会写入磁盘中。这意味着你需要查看磁盘空间使用情况。 这个设置有 4 个不同的值。针对每个值会有不同的信息显示。下面你将会看到每个值提供的信息是什么。也可以看堆栈跟踪特征的介绍提供的一些屏幕截图。
1 在 PHP 的 CLI 版本中将不会有 the tool tip,在输出文件中也没有。 xdebug.collect_return
类型:布尔值,默认值: 0
设置默认为 0,控制 Xdebug 是否应该将函数调用的返回值写入跟踪文件。 对于计算机的跟踪文件 (xdebug.trace_format=1) 仅仅只从 Xdebug 2.3 开始工作。 xdebug.collect_vars
类型:布尔值,默认值: 0
这个设置告诉 Xdebug 在一个确定的作用域中收集哪些变量信息。这个分析就和 Xdebug 需要反向设计 PHP 的操作码数组一样慢。这个设置将不会记录不同变量拥有哪些值,这种情况使用 xdebug.collect_params 。这个设置只有在你希望使用 xdebug_get_declared_vars() 时开启。
xdebug.coverage_enable
类型:布尔值,默认值: 1, 由 Xdebug >= 2.2 引入
如果这个设置设置为 0,那么 Xdebug 将不会组织内部结构来允许代码覆盖。这能让 Xdebug 速度加快一点,但是代码覆盖率分析将不会工作。
xdebug.default_enable
类型:布尔值,默认值: 1
如果这个设置设置为 1,错误事件发生时堆栈跟踪将会默认显示。可以在代码 xdebug_disable() 中关闭显示错误跟踪。这是 Xdebug 基础函数中的一个函数,建议将此设置设为 1.
xdebug.dump.*
类型:字符串,默认值: Empty
* 可以是 COOKIE,FILES,GET,POST,REQUEST,SERVER,SESSION 中的任何值。这 7 个设置控制了当错误状况出现时超级全局变量中的哪个数据将会显示。 每一个 php.ini 中的设置可以由逗号分隔的变量目录组成来实现转储,其中变量来自这个超级全局变量数组,或者是 当错误出现为了转储 REMOTE_ADDR,REQUEST_METHOD 和所有 GET 参数,添加这些设置: xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD xdebug.dump.GET = * xdebug.dump_globals
类型:布尔值,默认值: 1
当这个设置设置为
true 时,通过 xdebug.dump.* 配置的超级全局变量,Xdebug 会添加到屏幕堆栈和错误日志(如果开启了错误日志)。xdebug.dump_once
类型:布尔值,默认值: 1
控制超级全局变量的值是在所有错误中(设置为 0)转储还是只在第一次错误中(设置为 1)转储。
xdebug.dump_undefined
类型:布尔值,默认值: 0
如果你想转储超级全局变量中未定义的值应该设置这个设置为 1,否则保留它设置为 0。
xdebug.extended_info
类型:整数,默认值: 1
控制是否让 Xdebug 强制 PHP 解析器开启 "extended_info" 模式,它允许 Xdebug 在远程调试器中执行文件或行断点。当跟踪或者 profiling 脚本时通常应该关闭这个选项,因为 PHP 生成的 oparray 将会增加从而让脚本变慢。这个设置不能在脚本中用 ini_set() 设置,只能在 php.ini 中设置。
xdebug.file_link_format
类型:字符串,默认值: , 由 Xdebug > 2.1 引入
这个设置决定了在堆栈跟踪中显示文件名的链接形式。这允许 IDE 设置链接协议,通过点击 Xdebug 在堆栈跟踪中显示的文件名就能直接进入文件以及指定的行。格式会像这个示例: myide://%f@%l 可能的格式说明符:
针对不同的 IDE 或者 OS,这里是一些让其工作的说明清单: Firefox on Linux
Windows and netbeans
xdebug.filename_format
Type: string, 默认值: ...%s%n, 由 Xdebug >= 2.6 引入
这个设置决定了在 HTML 堆栈跟踪中 Xdebug 呈现的文件名(默认:
此表列出了可能的格式说明符。示例输出是根据全路径
xdebug.force_display_errors
类型:整数,默认值: 0, 由 Xdebug 2.3 引入
如果这个设置设置为 1,无论 PHP 的 display_errors 为多少,错误都将会显示。 xdebug.force_error_reporting
类型:整数,默认值: 0, 由 Xdebug 2.3 引入
这个设置是一个位掩码,像 error_reporting。这个位掩码将会与 error_reporting 所表示的位掩码进行逻辑与运算来决定应该显示哪种错误。这个设置只能在 php.ini 中完成,无论一个应用中 ini_set() 的值是多少,它允许你强制显示某些错误。 xdebug.halt_level
类型:整数,默认值: 0, 由 Xdebug 2.3 引入
这个设置允许你配置一个位掩码来决定是否将通知和(或者)警告转换为错误,以及将哪些通知和(或者)警告转换为错误。你可以配置 PHP 生成的通知和警告和你自己生成的通知和警告(意思是 trigger_error())。例如,转换 strlen()(没有参数)的警告为错误,你可以: ini_set('xdebug.halt_level', E_WARNING); strlen(); echo "Hi!\n"; 这结果将会是显示错误信息并且终止脚本。 这个设置是位掩码,针对所有应用转换所有通知和警告为错误,可以在 php.ini 中设置这个: xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE 这个位掩码只支持上面提到的 4 种错误级别。 xdebug.idekey
类型:字符串,默认值: *complex*
控制哪一个 IDE 键应该传递到 DBGp 调试处理器上,默认是基于环境设置的。首先是考虑环境设置 DBGP_IDEKEY,然后是 USER,最后是 USERNAME。默认设置为找到的第一个环境变量。如果默认为空则一个都找不到。如果这个设置设置了,它将总是会覆盖环境变量。
xdebug.manual_url
类型 字符串,默认值:http://www.php.net, 由 Xdebug < 2.2.1 引入
这是函数跟踪和错误信息指向的手册页面链接的基准 URL。建议这个设置设为使用最近的镜像。
xdebug.max_nesting_level
类型:整数,默认值: 256
针对无穷递归的控制保护机制。在脚本中止之前,这个函数嵌套的最大层级的设置值是被允许的。 在 Xdebug 2.6 之前,如果超出此值会产生致命异常。从 Xdebug 2.6 和以后的版本开始,会抛出一个 “Error” 异常代替。 在 Xdebug 2.3 之前,默认值是 xdebug.max_stack_frames
类型: 整型,默认值: -1,由 Xdebug >= 2.3 引入
控制堆栈跟踪中显示的堆栈帧数量,基于 PHP 错误堆栈跟踪期间的命令行,以及浏览器中的 HTML 跟踪。 xdebug.overload_var_dump
类型:布尔值,默认值: 2, 由 Xdebug > 2.1 引入
当 html_errors 在 php.ini 中设置为 你可以设置这个值为 在 Xdebug 2.4 之前,这个设置的默认值是 xdebug.profiler_aggregate
类型:整数,默认值: 0
当这个设置设为 1,将为多个请求编写单个分析文件。可以浏览多个页面或者重新加载页面以获得所有请求的平均值。这个文件将会命名为
.cachegrind.aggregate 。 你需要移动这个文件以获得另一轮聚合数据。xdebug.profiler_append
类型:整数,默认值: 0
如果这个设置设为 1,当一个新的请求映射到相同的文件(取决于 xdebug.profiler_enable_output_name 的设置)时 profiler 文件将不会被覆盖。反而新的 profile 将会被追加到文件中。
xdebug.profiler_enable
类型:整数,默认值: 0
开启 Xdebug 的 profiler 将会在 profile_output_directory 中创建文件。这些文件可以被 KCacheGrind 读取为可视化的数据。这个设置不能在脚本的 ini_set() 中设置。如果你想选择性的开启 profiler,请设置 xdebug.profiler_enable_trigger 为 1,而不是使用这个设置。
xdebug.profiler_enable_trigger
类型:整数,默认值:0
当这个设置设置为 1,通过使用 XDEBUG_PROFILE GET/POST 参数或者设置一个名 XDEBUG_PROFILE 的 cookie 将会触发生成 profiler 文件。这将会把 profiler 数据写入定义的目录。为了阻止 profiler 为每一个请求都生成 profile 文件,你需要设置 xdebug.profiler_enable 为 0。可以通过配置 xdebug.profiler_enable_trigger_value 来访问触发器本身。
xdebug.profiler_enable_trigger_value
类型:字符串,默认值: "", 由 Xdebug > 2.3 引入
这个设置可以用来限制在 xdebug.profiler_enable_trigger 中谁能利用 XDEBUG_PROFILE 功能进行概括。当将它的默认值更改为空字符串时,cookie 的值、GET 或者 POST 参数需要匹配设置在这个设置中的秘钥才能开启 profiler。
xdebug.profiler_output_dir
类型:字符串,默认值: /tmp
profiler 输出所在的这个目录将会被写入,需要确保运行 PHP 的用户有权限对这个目录进行写入。这个设置不能在脚本的 ini_set() 中设置。
xdebug.profiler_output_name
类型:字符串,默认值: cachegrind.out.%p
这个设置决定了用来转储跟踪信息的文件名。这个设置指定了格式化说明符的格式,非常类似于 sprintf() 和 strftime()。这里有几个格式化说明符可以用来格式化文件名。 查看 xdebug.trace_output_name 文档支持的说明符。 xdebug.remote_addr_header
类型:字符串,默认值: "", 由 Xdebug > 2.4 引入
如果 xdebug.remote_addr_header 配置为非空字符串,那么该值将用作超全局数组 $SERVER 中的键,来确定哪个头部来查找用于连接的 IP 地址或主机名。这个设置只能与 xdebug.remote_connect_back 结合使用,否则将被忽略。
xdebug.remote_autostart
类型:布尔值,默认值: 0
通常来说你需要使用一个指定的 HTTP GET/POST 变量来开启远程调试(查看远程调试)。当这个设置设为 1 时,即便 HTTP GET/POST 变量不存在,Xdebug 也将总是尝试开启一个远程调试会话并且设法连接到一个客户端。
xdebug.remote_connect_back
类型:布尔值,默认值: 0, 由 Xdebug > 2.1 引入
如果开启,xdebug.remote_host 设置将会被忽略,并且 Xdebug 将会让 HTTP 请求设法连接到客户端。它会检查 $_SERVER['REMOTE_ADDR'] 变量来寻找哪个 IP 地址可以使用。 如果配置了 xdebug.remote_addr_header ,那么将在 $_SERVER['HTTP_X_FORWARDED_FOR'] 和 $_SERVER['REMOTE_ADDR'] 变量之前检查 具有配置名称的 $SERVER 变量。 这个设置不适用于通过 CLI 调试,因为 $SERVER 头部变量在这里不可用。 请注意这里没有过滤变量,即使它的地址不能匹配 xdebug.remote_host,任何人也都能连接到网络服务器然后开启一个调试会话。 xdebug.remote_cookie_expire_time
类型:整数,默认值: 3600, 由 Xdebug > 2.1 引入
这个设置可以通过会话 cookie 增加(或减少)远程调试会话保持活跃的时间。
xdebug.remote_enable
类型:布尔值,默认值:0
这个开关控制 Xdebug 是否应该连接一个调试客户端来监听用 xdebug.remote_host 和 xdebug.remote_port 设置的主机和端口。如果一个连接不能被建立,脚本只将会像这个设置为 0 一样去继续运行。
xdebug.remote_handler
类型:字符串,默认值:dbgp
也可以为 "php3",这将选择旧版本的 PHP 的 3 种调试器输出。"gdb" 会开启像调试器接口的 GDB,或者是 "dbgp" —调试器协议。DBGp 协议是唯一支持的协议。 注意: Xdebug 2.1 和以后的版本仅支持 "dbgp" 作为协议。 xdebug.remote_host
类型:字符串,默认值:localhost
选择调试客户端在哪里运行,可以使用主机名或者 IP 地址。如果 xdebug.remote_connect_back 开启这个设置会被忽略。
对 Unix 域套接字支持由 Xdebug 2.6 引入。 xdebug.remote_log
类型:字符串,默认值:
如果设置了一个值,这将作为所有远程调试器通信记录的文件的名字。这个文件总是以 append-mode 打开,因此默认是不能被重写的。这里没有可用的并发保护。文件的格式像这样:
Log opened at 2007-05-27 14:28:15 -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/x ... ight></init> <- step_into -i 1 -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/db ... ></response> xdebug.remote_mode
类型:字符串,默认值: req
当一个调试连接初始化时选择。这个设置有两种不同的值:
xdebug.remote_port
类型:整数,默认值: 9000
Xdebug 尝试连接远程主机的端口。针对客户端和绑定的 debugclient,端口 9000 都是默认值。因为很多客户端使用的这个端口数,最好保持这个设置不要更改。
xdebug.remote_timeout
类型: 整型,默认值:200,由 Xdebug >= 2.6 引入
Xdebug 在 IDE 上等待确认传入调试连接以毫秒表示的时间量。默认值 200 毫秒在绝大多数情况下应该是足够的。如果你经常遇到调试请求丢失,可能是因为你有一个高延迟的网络,或者远离 IDE 的开发盒,或者防火墙速度慢,那么你可以增加此值。 请注意,增加此值可能意味着以防 Xdebug 尝试建立连接请求看似“挂起”,但是 IDE 没有在监听。 xdebug.scream
类型:布尔值,默认值: 0, 由 Xdebug >= 2.1 引入
如果这个设置为1,Xdebug 将会禁用 @(屏蔽错误、抑制报错)操作符,所以通知、警告和错误将不在隐藏。
xdebug.show_error_trace
类型:整数,默认值: 0,由 Xdebug >= 2.4 引入
当这个设置设为 1,当错误发生时,即便这个错误已经被捕获,Xdebug 都将会显示堆栈跟踪。
xdebug.show_exception_trace
类型:整数,默认值:0
当这个设置设为 1,每当异常发生,即便这个异常已经捕获, Xdebug 都将会显示堆栈跟踪。
‘异常’错误在 PHP 7 中引入。 xdebug.show_local_vars
类型:整数,默认值:0
当这个设置设为其他不等于 0 的值时,错误状况下 Xdebug 生成的堆栈转储信息将会在顶层作用域显示所有的变量。注意这可能生成大量的信息,因此默认是关闭这个设置的。
xdebug.show_mem_delta
类型:整数,默认值:0
当这个设置设为其他不等于 0 的值时,Xdebug 会生成易于人类阅读的跟踪文件,将会向显示不同函数调用间内存使用的差异。如果 Xdebug 是配置为生成易于计算机阅读的跟踪文件则将会总是显示这个信息。
xdebug.trace_enable_trigger
类型:布尔值,默认值: 0, 由 Xdebug > 2.2 引入
当这个设置设为 1,可以通过使用 XDEBUG_TRACE GET/POST 参数或者设置一个名为 XDEBUG_TRACE 的会话来触发生成跟踪文件。这将会把跟踪数据写入定义的目录。为了阻止 Xdebug 为每一个请求都生成跟踪文件,你需要设置 xdebug.auto_trace 为 0。可以通过配置 xdebug.trace_enable_trigger_value 来访问触发器本身。
xdebug.trace_enable_trigger_value
类型:字符串,默认值: "", 由 Xdebug >= 2.2 引入
这个设置可以用来限制在 xdebug.trace_enable_trigger 中谁能利用 XDEBUG_TRACE 功能进行概括。当将它的默认值更改为空字符串时,cookie 的值、GET 或者 POST 参数需要匹配设置在这个设置中的秘钥才能生成跟踪文件
xdebug.trace_format
类型:整数,默认值: 0
跟踪文件的格式:
计算机格式的字段:
查看函数跟踪的介绍的一些示例。 xdebug.trace_options
类型:整数,默认值: 0
当设置为 1,后续请求生成的跟踪文件将被追加而不是改写。
xdebug.trace_output_dir
类型:字符串,默认值: /tmp
跟踪文件将会被写入的目录,需要确保运行 PHP 的用户有权限对这个目录进行写入。
xdebug.trace_output_name
类型:字符串,默认值: trace.%c
这个设置决定了用来转储跟踪信息的文件名。这个设置指定了格式化说明符的格式,非常类似于 sprintf() 和 strftime()。这里有几个格式化说明符可以用来格式化文件名。".xt" 扩展总是会自动添加上。 可能的格式化说明符有:
2 从 Xdebug 2.6 起,跟踪文件名这个才是可用的。 3 版本 2.2 中的新增。这个可以通过 Apache 的 mod_unique_id 模式 修改。 xdebug.var_display_max_children
类型:整数,默认值: 128
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制数组子元素和对象属性显示的数量。 设置值为 -1 ,可以取消显示的任何限制。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 xdebug.var_display_max_data
类型:整数,默认值: 512
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制显示的字符串的最大长度。 设置值为 -1 ,可以取消显示的任何限制。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 xdebug.var_display_max_depth
类型:整数,默认值: 3
当变量通过 xdebug_var_dump() 、 xdebug.show_local_vars 或者函数跟踪显示时,控制数组子元素和对象属性嵌套多少层。 你可以选择的最大值是 1023 。你也可以使用 -1 作为值来选择这个最大的值。 这个设置不会对通过远程调试功能发送到客户端的子元素数量有任何影响。 相关函数void var_dump( [mixed var [, ...]] )
显示变量的细节方面的信息
这个函数由 Xdebug 重载,看 xdebug_var_dump() 的描述。 bool xdebug_break()
发送一个断点到调试客户端
这个函数能让调试器在特定的行中断,就像一个普通文件/行断点被设置在该行一样。 string xdebug_call_class( [int $depth = 2] )
返回调用的类,如果堆栈帧不存在返回
NULL ,如果堆栈帧没有类信息则返回 FALSE 这个函数返回定义当前方法的类的名称,如果没有与此调用关联的类则返回 示例:
<?php 返回:
Called @ /home/httpd/html/test/xdebug_caller.php:17 from ::{main}
为了从更早的堆栈帧中获得信息,请使用可选的 示例:
<?php 返回:
Strings::fix_string is called at /home/httpd/html/test/xdebug_caller:17
值为 示例:
<?php 返回:
Strings::fix_strings is called at /home/httpd/html/test/xdebug_caller:25
值为 示例:
<?php 返回:
::xdebug_call_function is called at /home/httpd/html/test/xdebug_caller:13 string xdebug_call_file( [int $depth = 2] )
返回调用文件,如果堆栈帧不存在则返回
NULL string xdebug_call_function( [int $depth = 2] )
返回调用的函数或者方法,如果堆栈帧不存在则返回
NULL ,如果堆栈帧没有函数或者方法信息则返回 FALSE int xdebug_call_line( [int $depth = 1] )
返回调用的行号,如果堆栈帧不存在则返回
NULL boolean xdebug_code_coverage_started()
返回代码覆盖是否活跃
返回代码覆盖是否已经开启。 示例:
<?php 返回:
bool(false) bool(true) void xdebug_debug_zval( [string varname [, ...]] )
显示一个变量的信息
这个函数显示一个或更多变量的结构化的信息,包含它的类型、值和引用信息。数组是递归性地探测值的。为了绕过变量本身实际上已经传递给了函数这个问题,这个函数的实现不同于 PHP 的 debug_zval_dump() 函数的实现。Xdebug的版本更好是因为它使用这个变量名在内部符号表中查找这个变量,而且能直接访问所有的属性而不用实际地传递一个变量到函数来处理。结果是这个函数返回的信息比 PHP 自己的函数显示的容器信息更加准确。 任何变量的支持是自 Xdebug 2.3 开始的,除了简单的变量名(比如下方的 "a[2]")。 示例:
<?php 返回:
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)=1, 1 => (refcount=1, is_ref=0)=2, 2 => (refcount=2, is_ref=1)=3) a[2]: (refcount=2, is_ref=1)=3 void xdebug_debug_zval_stdout( [string varname [, ...]] )
返回一个变量标准输出的信息
这个函数显示一个或更多变量的结构化的信息,包含它的类型、值和引用信息。数组是递归性地探测值的。和 xdebug_debug_zval 不同的是这个信息不是通过网络服务器 API 层显示的,而是直接输出显示(所以当你用 Apache 单进程模式运行它,它在控制台结束)。 示例:
<?php 返回:
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)=1, 1 => (refcount=1, is_ref=0)=2, 2 => (refcount=2, is_ref=1)=3) void xdebug_disable()
禁止堆栈跟踪
错误状态时禁止显示堆栈跟踪。 void xdebug_dump_superglobals()
显示超级全局变量的信息
这个函数以 xdebug.dump.* 在 php.ini 中指定的设置转储超级全局变量元素的值。例如下面在 php.ini 中的设置: 示例:
xdebug.dump.GET=* 返回:
void xdebug_enable()
开启堆栈跟踪
错误状态时开启显示堆栈跟踪。 array xdebug_get_code_coverage()
返回代码覆盖信息
返回一个数组结构,包含哪些行在脚本中(包括 inlcude 的文件)被执行了的信息。下面的示例展示了一个指定文件的代码覆盖: 示例:
<?php 返回:
array '/home/httpd/html/test/xdebug/docs/xdebug_get_code_coverage.php' => array 5 => int 1 6 => int 1 7 => int 1 9 => int 1 10 => int 1 11 => int 1 12 => int 1 13 => int 1 15 => int 1 16 => int 1 18 => int 1 string xdebug_get_collected_errors( [int clean] )
返回收集的所有错误信息
在 2.1 版本引入
这个函数从缓存集合区返回所有的错误,缓存区包含当用 xdebug_start_error_collection() 把错误集合开启时存储在这里的所有错误信息。 默认设置这个函数不会清除错误缓存集合区。如果传递 "true" 作为这个函数的参数,那么缓存区也将会被清除。 这个函数会返回一个字符串,包含用 "Xdebug 表格"格式化的所有收集的错误。 array xdebug_get_declared_vars()
返回声明的变量
返回一个数组,包含当前作用域中被声明的变量。这个设置需要 xdebug.collect_vars 来开启。 示例:
<?php 返回:
array 0 => string 'a' (length=1) 1 => string 'b' (length=1) 2 => string 'item' (length=4) 在 PHP 5.1 之前的版本中,变量名 "a" 不再返回到数组中,因为它不在函数 xdebug_get_declared_vars() 调用的作用域中。 array xdebug_get_function_stack()
返回堆栈的信息
返回一个类似于堆栈跟踪的数组。示例脚本: 示例:
<?php 返回:
array 0 => array 'function' => string '{main}' (length=6) 'file' => string '/var/www/xdebug_get_function_stack.php' (length=63) 'line' => int 0 'params' => array empty 1 => array 'function' => string 'fix_strings' (length=11) 'class' => string 'strings' (length=7) 'file' => string '/var/www/xdebug_get_function_stack.php' (length=63) 'line' => int 18 'params' => array 'b' => string 'array (0 => 'Derick')' (length=21) 2 => array 'function' => string 'fix_string' (length=10) 'class' => string 'strings' (length=7) 'file' => string '/var/www/xdebug_get_function_stack.php' (length=63) 'line' => int 12 'params' => array 'a' => string ''Derick'' (length=8) array xdebug_get_headers()
通过调用 PHP header() 函数,返回设置的所有头部信息
在 2.1 版本引入
以数组的形式返回由 PHP header() 函数设置或者由 PHP 内部设置的(比如通过 setcookie())所有的头部。 示例:
<?php 返回:
array(2) { [0]=> string(6) "X-Test" [1]=> string(33) "Set-Cookie: TestCookie=test-value" } array xdebug_get_monitored_functions()
返回监控函数的信息
由 2.4 版本引入
返回一个数组结构,包含监控函数在脚本中哪里执行的信息。下面的示例展示了怎样使用它和返回的信息。 示例:
<?php 返回:
/tmp/monitor-example.php:10: array(2) { [0] => array(3) { 'function' => string(6) "strrev" 'filename' => string(24) "/tmp/monitor-example.php" 'lineno' => int(6) } [1] => array(3) { 'function' => string(6) "strrev" 'filename' => string(24) "/tmp/monitor-example.php" 'lineno' => int(8) } } string xdebug_get_profiler_filename()
返回 profile 信息的文件名
返回用来保存 profile 信息的文件的名字。 integer xdebug_get_stack_depth()
返回当前堆栈的深度
返回堆栈的深度。脚本的主体 main{} 的深度为 0,每一个 inlcude 和 函数调用会让堆栈深度增加一级。 string xdebug_get_tracefile_name()
返回函数跟踪的文件名
返回用来跟踪脚本输出的文件名。当 xdebug.auto_trace 开启时这个设置很有用。 bool xdebug_is_debugger_active()
返回调试会话是否活跃
由 2.6 版本引入
如果通过 DBGPS 的调试会话,与客户端连接当前处于活跃状态,则返回 bool xdebug_is_enabled()
返回堆栈跟踪是否开启
在发生错误的情况下,返回堆栈跟踪是否会显示。 int xdebug_memory_usage()
返回当前的内存使用
返回当前脚本使用的内存数量。在 PHP 5.2.1 之前,只工作在 PHP 使用 --enable-memory-limit 编译之后。在 PHP 5.2.1 和之后的版本中这个函数总是有效的。 int xdebug_peak_memory_usage()
返回内存使用的峰值
返回截止到目前脚本使用内存的最大数量。在 PHP 5.2.1 之前,只工作在 PHP 使用 --enable-memory-limit 编译之后。在 PHP 5.2.1 和之后的版本中这个函数总是有效的。 none xdebug_print_function_stack( [ string message [, int options ] ] )
显示当前函数的堆栈
以类似于 Xdebug 在错误状况下显示的方式来显示当前函数的堆栈。 "message" 参数允许用自己的头部信息来替换。(在 Xdebug 2.1 中引入) 示例:
<?php 返回:
位掩码 "options" 允许你配置一些额外的选项。下面的选项是目前支持的:
void xdebug_set_filter( int $group, int $list_type, array $configuration )
设置过滤器
由 2.6 版本引入
当展示堆栈跟踪或者记录番函数跟踪时,或者当收集代码覆盖时,这个函数配置 Xdebug 使用的过滤器。过滤器配置应用于每个独立的执行单元(函数,方法,脚本体)。
第一个参数,
你可以设置不同类型的过滤器。对于文件路径或完全限定类名,有一个白名单和黑名单选项。
用做第二个参数 "
不能同时配置黑名单和白名单,或者为路径和命名空间配置黑名单/白名单。 在任意的一个时间,四种列出的类型中只有一种能活跃。但是可以使用
排除跟踪 示例:
<?php
包含跟踪函数调用(不在类名之下), 示例:
<?php
只在 示例:
<?php void xdebug_start_code_coverage( [int options] )
开启代码覆盖e
这个函数开始统计代码覆盖的信息。这个信息由二维数组组成,数组主下标是执行的文件名字,第二个索引是行号。返回的值代表是否代码行已经执行或者是不可执行的代码行。 每一行返回的值:
-1 只有在 XDEBUG_CC_UNUSED 开启时会返回,值 -2 只有在 XDEBUG_CC_UNUSED 和 XDEBUG_CC_DEAD_CODE 都开启时才会返回。
这个函数有两个选项,他们是位字段:
可以像下面示例中展示的一样使用这个选项。 示例:
<?php void xdebug_start_error_collection()
开启记录所有的通知、警告和错误,并且阻止他们的显示
在 2.1 版本引入
当这个函数执行时, Xdebug 将会让 PHP 不显示任何通知、警告和错误。而是根据 Xdebug 正常标准的错误格式化规则来格式化这些信息并储存在缓存区中。直到调用 xdebug_stop_error_collection() 才会停止。 这个缓存区的内容可以通过调用 xdebug_get_collected_errors 来获取并接着显示出来。如果你想阻止 Xdebug 强力的错误报告功能破坏你的布局,这个函数非常有用。 void xdebug_start_function_monitor( array $list_of_functions_to_monitor )
开启函数监控
由 2.4 版本引入
这个函数对函数参数语句中的函数条目开启了监控。函数监控允许找出作为参数的函数在代码中的哪里被调用了。这个可以用来跟踪在哪里使用了旧版本或不推荐的函数。 示例:
<?php 你也可以添加类方法和静态方法到数组中来定义哪些函数被监控。例如,捕获静态调用 DramModel::canSee 和 动态调用 Whisky->drink,你需要这样开启监控: 示例:
<?php 被定义的函数是大小写敏感的,一个静态方法的动态调用将不会被捕获。 string xdebug_start_trace( [ string trace_file [, integer options] ] )
开启一个新的函数跟踪
开启从该函数到 trace_file 参数的文件的跟踪。如果没有函数名指定,那么跟踪文件将会被配置 xdebug.trace_output_dir 设置中的目录替代。 如果文件名作为第一个参数给出,则名字是针对当前工作目录的相对路径。这个当前工作目录可能不同于你所期望的,所以如果要指定一个文件名请使用一个绝对路径。可以使用 PHP 的 getcwd() 函数来计算出当前工作目录是什么。 跟踪文件的名字是 "{trace_file}.xt"。如果 xdebug.auto_trace 开启,那么 "{trace_file}.xt" 在 "{trace_file}" 部分的格式会取决于 xdebug.trace_outpuut_name 的设置。这个 options 是一个位字段,目前有这几种选项:
这个函数会返回 Xdebug 跟踪的文件名和全路径。这可能会是你传递的文件名(潜在的添加 ".xt"),如果没有文件名传递进去就会是自动生成的文件名。 void xdebug_stop_code_coverage( [int cleanup=true] )
停止代码覆盖
这个函数会停止收集信息,内存中的信息将会被销毁。如果传递 "false" 作为参数,那么代码覆盖将不会被销毁,以至于可以再次使用 xdebug_start_code_coverage() 函数来继续收集信息。 void xdebug_stop_error_collection()
停止记录由 xdebug_start_error_collection() 开启的所有通知、警告和错误。
在 2.1 版本引入
当函数执行时,由 xdebug_start_error_collection() 开启的错误收集将会停止。这些错误储存在缓存集合区不会被删除,仍然可以通过 xdebug_get_collected_errors 获取到。 void xdebug_stop_function_monitor()
停止监控函数
由 2.4 版本引入
这个函数停止函数监控。为了获得监控函数的清单,需要使用 xdebug_get_monitored_functions() 函数。 string xdebug_stop_trace()
停止当前函数跟踪
停止跟踪函数调用,关闭跟踪文件。 函数返回跟踪被写入的文件的文件名 float xdebug_time_index()
返回当前的时间索引
返回自脚本开始时的时间索引,以秒为单位。 示例:
<?php 返回:
0.00038003921508789 0.76580691337585 void xdebug_var_dump( [mixed var [, ...]] )
显示一个变量的详细信息
这个函数显示一个或更多变量的结构化的信息,包含它的类型、值和引用信息。数组是递归性地探测值的。查看变量显示特征的介绍,可以看到 php.ini 的设置如何影响这个函数。 示例:
<?php 返回:
array 0 => array 0 => boolean true 1 => int 2 2 => float 3.14 more elements... 'object' => object(stdClass)[1] public 'foo' => string 'bar' (length=3) public 'file' => resource(3, stream) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||