修改XDebug

XDebug是一个很好用的PHP调试工具. 内含的var_dump可以改变PHP默认的var_dump的行为, 主要是给变量加上不同的HTML颜色, 还有层级, 这样就可以直接在页面状态下, 清楚地查看var_dump输出的内容.

由此一来, 最近稍稍有些依赖这个功能, 并且在开发中很少将临时添加上的var_dump函数去掉. 虽然可以在代码中写入var_dump之前敲入类似 //TODO:: 的字样(这是个好习惯!!!)

但我还是懒了…导致目前我有N多处的var_dump, 根本不知道放在哪里了 T-T

so, 除了用grep搜索, 另一种办法就是修改XDebug的默认行为了~

目标是, 给XDebug的var_dump增加 显示 当前文件以及所在行号 的行为. 效果如下图

xdebug-mod

完成效果

查了下PHP手册, 发现两个函数:
zend_get_executed_lineno()zend_get_executed_filename()

两个都是Zend提供的API函数, 前者获取当前执行文件的行号, 后者就是脚本的文件名了.

然后就是 下载, 修改源代码, 重新编译, 安装, 重启PHP-FPM.

由于我用的是FreeBSD, 而且我也没什么配置可改的, 下载可以用 make configure 去完成. (在 /usr/ports/devel/php-xdebug 下执行)
如果前面用ports 安装过php-xdebug, 需要 make deinstall clean 一下.

make configure 之后, 可以直接编辑 vi work/xdebug-2.0.5/xdebug_var.c

Ver.2.0.5的XDebug 的这个文件, 需要修改的函数在第 #1031 行开始, 名字叫 xdebug_get_zval_value_fancy

函数的最前面是变量定义区, 为了适应微软的VS系列, 强烈建议把变量定义在函数内容的最开始部分. 增加下面两行

================Start of Block==================

char temp[4096] = {0}; //用来保存行号, 以及文件名的缓存. 4096Byte, 应该足够了.

int temp_strlen = 0; //等下用这个保存所需内容的字符串长度

================End of Block===================

然后, 在下面的 if (!options) {...} 区块后面加上下面的内容

================Start of Block==================

xdebug_str_addl(&str, "<div style='border:#000 dashed 2px; margin:10px; padding: 10px;'>", 65, 0);//在这里我定义了外层DIV, 也就是轮廓的样式.

temp_strlen = sprintf(temp, "<div style='color:#999;'><b>Line:</b> <span>%u</span> <b>@</b> <b>File:</b> <span>%s</span>;</div>", zend_get_executed_lineno(), zend_get_executed_filename());//在这里我定义了行号, 文件名的样式, 同时输出行号 以及 文件名 到缓冲变量 temp 中, 并将 temp 的字符串长度, 保存到 temp_strlen 中.

xdebug_str_addl(&str, temp, temp_strlen, 0);//输出相应的信息

================End of Block===================

注意, WordPress可能会对英文状态的单/双引号进行转义, 复制粘贴的时候自行转过来即可.

再来就是 xdebug_str_addl(&str, "</pre>", 6, 0); 部分的后面, 另起一行, 结束上面的 <div>

================Start of Block==================

xdebug_str_addl(&str, "</div>", 6, 0);//结束外层DIV, 也就是轮廓的定义

================End of Block===================

OK, 改的差不多了;
xdebug_str_addl函数的功能不太了解, 应该就是输出内容. 具体怎么用, 我会附加到评论中. 想自己定义样式的请先看这个函数的用法吧.

既然改的差不多了, 就 :wq 吧, pwd 确定一下自己现在的位置, 没问题之后, make install

如果没出什么 Error, 就表示编译安装完毕咯.

然后去 /usr/local/etc/rc.d/php-fpm restart 一下, 如果没有提示说xdebug的载入出现问题, 那就马上写一段var_dump() 来检查一下生效后的效果吧. ^-^

此条目发表在 PHP 分类目录,贴了 , , 标签。将固定链接加入收藏夹。

修改XDebug》有 2 条评论

  1. ETiV 说:

    xdebug_str_addl:
    xdebug_str_addl(&str, (char*)”c-style string”, (int)strlen(param2), (int)start-offset);

    zend_get_executed_lineno() 以及 zend_get_executed_filename():
    虽然从手册上看上去, 这两个函数像是带有了参数, 但在我这里(FreeBSD 64bit), 他们的参数是被定义成 void 的宏. 即,
    #defind TSRMLS_D void

    所以你也同我一样的情况, 直接用就好, 不用添加任何参数.

发表评论

电子邮件地址不会被公开。 必填项已被标记为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>