php程序调试方法总结

php程序调试方法总结

相信很多朋友们都有调试程序的经历,然而很多时候调试程序是痛苦而又漫长的过程;它不仅需要细心,更需要耐心,切忌心浮气躁。但是当找出问题并顺利解决它时,又会给人无比激动的喜悦。这里总结一下笔者在程序调试中的使用的原则,工具,以及方法。这里需要说明的是,某些原则性的东西,各种语言都是差不多的,而涉及到具体的工具和某些具体的调试方法,这里只涉及web开发方面的内容。

总体原则:

1.找出问题原因:

程序需要调试,是因为程序有问题。而调试的第一目标是找到原因。常见调试方法, 排除法: 当我们面对整个复杂的系统时,常常完全不知道问题出在什么地方;这个时候可以先将与问题不相关的地方排排除,逐渐缩小调试范围。独立模块法: 大部分程序都有模块结构,将可疑模块单独拿出来,模拟输入相应的操作数据,看是否出现问题。比较法:如果程序或系统是基于某个平台时,可以先看看其他基于本平台的程序或系统,找出是平台问题还是本程序问题,很多时候这种方法是用来排除不成熟平台上的隐藏问题。对比法:对于自己实现的程序,可能已经有相应的开源的模块,可以把这些程序源码找出来,和自己的程序进行对比,这样不仅节省时间,还能借鉴别人的优秀之处。

2.问题定位:

问题原因的多种多样,可能这个时候你只能知道是什么样的问题, 可能与什么相关, 这个时候就需将出现的代码段找出来。而需要做到这一步,一般开发环境为我们提供很多实用工具,借助这些工具,可以一步一步地查看程序的输入和输出,根据每一步的输入输出,定位问题。

有一部分很厉害的人,可以通过阅读代码,找到出现问题的地方。但是很多问题都是调试者自己因为疏忽造成的,而要通过这样方式去查找问题,几乎是不可能的,因为已经形成固定的思维定势。

3.解决问题

找到问题的原因和相应代码行,解决它很多时候是一件比较简单的事,因为这些问题往往自己疏忽或者自己考虑不周。但是某些时候并不总是这样的,而是由于外部环境造成的,比如你的网站访问的人数增多,你当初没有考虑到这些数据压力,同时也没有考虑到高度并发性的问题,这个时候问题解决起来是你觉得比较棘手。而要解决这样的问题,不仅仅要专注程序, 更要从系统架构方面着手,综合各方面的知识,进行全面的考虑。

web开发常用调试工具

俗话说:工欲善其石,必先利其器。对于程序的调试,也必须借助外部工具。这里介绍几种在开发web程序中常常用到的工具:

xdebug, xhprof:php性能调试工具。他们都是php的一种扩展,可以很方便的安装和配置。这两个工具主要是将你程序的内部运行状况,调用函数以一种简洁的方式告诉你。让你对程序在什么地方占用过多的资源,那些地方需要进行优化一目了然。 顺便提一下,xdebug生成的profile文件一般借助winCacheGrid查看。

firephp, firbug: 前者主要是php的调试工具,而后者是web开发必不可少的工具, 它不仅能查看请求,还能调试js,css。

在ie下面可以使用HttpWatch。如果需要将数据做深入分析,可以使用抓包工具。

php中常使用的调试函数:error_report, var_dump, print_r, var_export

mysql,apache/nginx的常用的调试技巧:分析他们日志文件也是相当重要。在linux下查看日志文件的常用命令: cat, more, less, grep, awk, sed

常见的调试技巧和方法

下面以我调试的程序来介绍一下具体的调试方法和技巧。

例子1: 这是一个php开发的游戏引擎,主要功能提供双发球员移动位置,状态,传球,技能等功能控制,整个程序通过xml文件保存结果。突然某天,有两个用户进行比赛,返回的xml不符合正常的结构。从返回的结果来看,球员的移动位置有些不正常,其中少了某些步骤,于是决定从游戏的AI入手查找,但是也没有发现此处有什么异常。最后将输入的球员数据打印出来,然后将中间产生的数据也打印出来,结合程序的处理逻辑,发现是这两个用户有同一个球员,因此导致在处理的时候, 两个人的球员出现混乱。找到原因后,就将这个以球员标识改为以球队和球员共同决定即可。

例子2:程序刚上线, 有些热心的朋友们喜欢对程序进行一些压力测试。某次突然20w的请求很大的一个静态资源,直接导致硬盘瘫痪。对于这种情况,必须查看访问日志,才知道发生什么事。否则人家对你攻击了, 你还找不到原因。当然对于这样的攻击,直接把静态资源放到cdn上。另外,随着访问用户量的增大,系统的压力增大, 反应逐渐变慢,我们不得不考虑:以前只需要0.000几毫秒能处理的程序,现在需要0.几秒。这个时候程序的并发性设计就很重要了。否则会造成数据异常的情况。

例子3:使用外部软件出现异常:例如使用memcached的时候,如果某台没有启动或者不能使用了。这个时候nginx一般就会对某些使用memcache的请求返回502,是不是感觉有点无厘头,可以考虑改写memcahce 的php扩展了