如何使用Xdebug系列之二 使用xdebug跟踪PHP程序

本文为转载内容,正文中需注明作者及出处,若对您造成侵权,请联系我们

我在上一帖里主要讲了Xdebug的安装和一些基本功能的使用,这帖主要来讲用Xdebug跟踪PHP程序。
   下面探讨一个问题:随着编程技术的发展特别是面向对象的技术的到来,开发一个系统时涉及到的程序结构越来越复杂!这是因为个根据“强内聚,松耦合”原则,每个写出来的类或者方法里的代码越来越少,每个单个类或者单个函数看起来都很简洁明了。
但随之而来的是开发一个系统可能会用到很多和很多类,那系统的执行流程就变得复杂。
那怎么样才能更好的了解整个系统运行轨迹或者执行流程呢?
    下面举例2个常用方法:
    第一:在每个感觉程序可能运行到的节点上写个var_dump();
    第二:用日志(logging)
    但这2种方法都有的缺点是:1.你必须要改源代码,2.影响性能,3.繁琐

    可以用Xdebug生成跟踪日志(trace log)解决这个问题。
程序每次运行产生的跟踪日志一般都不一样,这是因为运行的轨迹都收到输入数据以及其他因素影响而改变运行轨迹!
查看一次运行的跟踪日志我们可以了解这次运行的控制流程。
事实上不可能跟踪查看系统的每个运行轨迹,因为随着系统的复杂度,能运行的轨迹数可能指数增长,除非系统是非常简单,这也是测试软件一般比较困难的原因。

第一,生成跟踪日志
下面开始用Xdebug做跟踪日志
Xdebug支持2种跟踪日志格式,即人类可读(0)和机器可读(1)
例如:
xdebug.trace_format=0

在php.ini添加以下2行指令即可打开跟踪日志功能
xdebug.auto_trace=Onxdebug.trace_output_dir=D:\tracedata其中D:\tracedata是跟踪日志存放目录
注意:不能用ini_set(‘xdebug.auto_trace’, ‘On’)来打开跟踪日志功能

第二,生成部分跟踪日志
由于跟踪日志文件增长的比较快,可以指定只对自己感兴趣的部分生成跟踪日志
用xdebug_start_trace(‘c:/data/fac.xt’);xdebug_stop_trace();来实现这个功能例如:

[AppleScript] 纯文本查看 复制代码


运行后产生的跟踪日志文件内容:  


跟踪日志文件第一列显示总共运行所耗时间,第列行显示运行时内存使用情况,第三列显示函数名称,文件位置以及行号
如果你想显示运行时所耗内存间的差异,在php.ini添加xdebug.show_mem_delta=On指令就可以了

xdebug_start_trace(),还有第二个可选参数,如果该参数是XDEBUG_TRACE_APPEND则新产生的跟踪日志内容添加在原先内容后面儿不是覆盖原先跟踪日志内容。
如果该参数是XDEBUG_TRACE_COMPUTERIZED则长生机器可读的跟踪日志,效果跟在php.ini里添加xdebug.trace_format=1一样。
如果该参数是XDEBUG_TRACE_HTML则产生html格式的跟踪日志。

第三,跟踪日志里增加更多信息
使用xdebug.collect_params指令可以在跟踪日志显示函数参数相关信息。有关xdebug.collect_params的介绍前一帖里已经讲过了,这里就不重复介绍了。
使用xdebug.collect_return=On可以在跟踪日志显示每个函数的返回值
在php.ini 里添加xdebug.collect_return=On后的跟踪日志内容如下:


第四,给跟踪日志命名
到现在为止我们都是明确指定跟踪日志的名称,这样带来的问题是生成的跟踪日志内容始终在同一个跟踪日志文件里。
有时我们可能需要根据输入数据或者系统状态把跟踪日志生分别成到不同的文件里,Xdebug提供了这样的功能!
注意:生成的跟踪日志文件始终是trace.开头并以.xt结尾,2个“.”之间是可指定的命名部分。
使用xdebug.trace_output_name指令来指定命名规则
可使用的指定格式如下:

  • %c 对当前工作目录进行循环校验(CRC)
  • %p 进程 id
  • %r 随机数
  • %u 时间戳
  • %H $_SERVER[‘HTTP_HOST’]
  • %R $_SERVER[‘REQUEST_URI’]

例如:xdebug.trace_output_name=”%H.%R.%c.%p.%r.%u”是生成的跟踪日志文件如下:



原文地址:使用Xdebug五部曲之二 使用Xdebug跟踪(Tracing)PHP程序