PHP Xdebug调试专题 - 手动触发记录

  • 作者:KK

  • 发表日期:2016.2.24


请求参数触发

如果配置xdebug.auto_trace=on的话,你运行任何PHP文件都会产生回溯记录

但有时候你只需要回溯某一个地址的运行轨迹,可以通过设置xdebug.trace_enable_trigger=on来实现,但前提是要设置xdebug.auto_trace=off(或者删除这个选项))

配置样本:

xdebug.auto_trace=off
xdebug.trace_enable_trigger=on
xdebug.trace_output_dir="E:\xdebug"

这样你访问/index.php不会产生回溯记录,但是你如果修改一下URL参数,加上XDEBUG_TRACE这个参数名,不用参数值,只要有参数名就行了

就是访问这样的/index.php?XDEBUG_TRACE地址,然后就会产生文件了,这就是通过GET参数触发

而通过POST请求也是这样,如果你的POST参数中带有XDEBUG_TRACE才会有回溯

$.ajax({
	url : '/index.php',
	type : 'post',
	data : {
		a : 1,
		XDEBUG_TRACE : 11 //这个值随便设置,如果你不设置就不会POST这个字段上去!
	}
});

函数触发

在测试前请先确认配置xdebug.auto_trace=off(关闭自动回溯)

然后找到你要开始追踪回溯的代码位置调用xdebug_start_trace函数,再在要停止追踪回溯的位置调用xdebug_stop_trace函数,这样就会生成回溯信息,并且是对你开始和结束trace函数之间的代码进行记录,其它无关的代码是不记录的

样例代码:

$str = 'abc';
$str1 = substr($str, 0, 2);
xx('a', 'b');

function xx($a, $b){
	xdebug_start_trace(); //开始记录回溯
	$x = array();
	array_push($x, $a);
	print(222);
	array_push($x, $b);
	xdebug_stop_trace(); //结束记录回溯
	yy();
	return $x;
}

function yy(){
	print_r(123);
}

并且要注意,通过函数触发的话并不需要什么配置,你只要开启了扩展就可以,就是只保留zend_extension="xdebug.dll"就可以,其它xdebug的相关配置可以完全不配置,如果有文件名定制需求就再保留xdebug.trace_output_name选项就足够了

然而如果你开启了xdebug.auto_trace其实相当于让PHP启动时就自动执行xdebug_start_trace函数,于是会报错说这个函数已经执行过了,所以为避免麻烦请不要开启xdebug_start_trace

这个调试更加精准,因为如果整个运行周期都回溯下来,起码有成千上万行,查找成为了艰难的事情

而函数触发时就缩小了你需要的范围,查找就快捷了很多!