了解了一些PHP程序的调试方法之后,在PHP程序报错之后如何进行调试呢?从哪里开始PHP程序的调试,又到哪里结束调试呢?从开始调试到结束有几个路径?调试的分支点变量状态监视,传入的参数是什么,返回的数值又是什么?以上问题应该都是我们调试程序时所关心的,也想了解的。下面就进一步介绍一些关于调试的方法。
不管面向对象还是面向过程,最小的功能体都是函数(方法)。我们大部分的跟踪调试都是在函数(方法)中进行的,一般跟踪的内容有:
1. 传入参数
2. 返回值
先检查函数的传入值是否正常,如果正常,就要看返回值是否正常,否则返回函数调用的地方向前跟踪。
a. 变量值跟踪方法
PHP脚本的调试一般要靠不停的echo要监视的变量,看其是否符合我们的预期,一直echo到不符合预期的地方,就是问题的所在。但是现在ajax用的比较多,echo的内容不一定能回显,所以我们一般用error_log这样的函数来讲变量结果记录到文件中,例如在test.php中加入这么条语句
error_log($var,3,__FILE__.”.var.log”);
这个语句可以把$var变量记录到文件test.php.var.log这个文件中,如果$var是数值,对象,布尔值的情况下,我们还需要var_export函数去将它导出
error_log(var_export($aArr,true),3,__FILE__.”.aArr.log”);
var_export的第二个参数为true表示将结果做为函数返回值返回,而不是想echo结构那样直接向标准输出输出。
b. 传入参数跟踪方法
PHP有提供func_get_args()这么一个函数来获取参数传入的值,例如在test.php中有chgArea()这么一个函数
function chgArea($areaid, $totalmoney,$postcode,$consumepoint, $taxratio=0)
{
error_log(var_export(func_get_args(),true),3,__FILE__.”.args.log”);
global $INC_ID;
global $INC_DIR;
global $PROG_TAGS;
global $Currency;
global $nowrate;
………………
………………
}
它将返回一个标准ajax的xml文件给浏览器做无刷变更页面的内容,因此直接用echo获取变量会导致页面出错(非法xml返回)
error_log(var_export(func_get_args(),true),3,__FILE__.”.args.log”);
这句话会把chgArea函数传入的变量写入到test.php.args.log文件中
c. 变态单步调试
所谓变态是指在每一个执行语句后放上一个die语句,逐步把它们注释,一直die的值不能正常显示。每句后面都放一个die当然比较傻,可以用二分法快速定位,先放函数最后,然后放中间,然后放中间的中间……直到找到造成错误的页面为止