您所在的位置:主页 > 电脑网络 > 编程教程 > php程序调试法子总结

php程序调试法子总结

更新:2013-12-07    编辑:落烟灰    来源:谷普整理    人气:加载中...    字号:|

标签:方法  程序  总结  调试  

   信任很多朋友们都有调试程序的经历,然而很多时候调试程序是苦楚而又漫长的历程;它不仅需要细心,更需要耐心,切忌心浮气躁。但是当找出问题并顺利解决它时,又会给人无比感动的喜悦。这里总结一下笔者在程序调试中的应用的原则,工具,以及法子。这里需要说明的是,某些原则性的东西,各种语言都是差不多的,而涉及到具体的工具和某些具体的调试法子,这里只涉及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扩展了


本文链接:http://www.gpxz.com/diannao/biancheng/285395.html