相信很多朋友们都有调试程序的经历然而很多时候调试程序是痛苦而又漫长的过程;它不仅需要细心更需要耐心切忌心浮气躁但是当找出问题并顺利解决它时又会给人无比激动的喜悦这里总结一下笔者在程序调试中的使用的原则工具以及方法这里需要说明的是某些原则性的东西各种语言都是差不多的而涉及到具体的工具和某些具体的调试方法这里只涉及web开发方面的内容
总体原则
找出问题原因
程序需要调试是因为程序有问题而调试的第一目标是找到原因常见调试方法 排除法: 当我们面对整个复杂的系统时常常完全不知道问题出在什么地方;这个时候可以先将与问题不相关的地方排排除逐渐缩小调试范围独立模块法: 大部分程序都有模块结构将可疑模块单独拿出来模拟输入相应的操作数据看是否出现问题比较法如果程序或系统是基于某个平台时可以先看看其他基于本平台的程序或系统找出是平台问题还是本程序问题很多时候这种方法是用来排除不成熟平台上的隐藏问题对比法对于自己实现的程序可能已经有相应的开源的模块可以把这些程序源码找出来和自己的程序进行对比这样不仅节省时间还能借鑒别人的优秀之处
问题定位
问题原因的多种多样可能这个时候你只能知道是什么样的问题 可能与什么相关 这个时候就需将出现的代码段找出来而需要做到这一步一般开发环境为我们提供很多实用工具借助这些工具可以一步一步地查看程序的输入和输出根据每一步的输入输出定位问题
有一部分很厉害的人可以通过阅读代码找到出现问题的地方但是很多问题都是调试者自己因为疏忽造成的而要通过这样方式去查找问题几乎是不可能的因为已经形成固定的思维定势
解决问题
找到问题的原因和相应代码行解决它很多时候是一件比较简单的事因为这些问题往往自己疏忽或者自己考虑不周但是某些时候并不总是这样的而是由于外部环境造成的比如你的网站访问的人数增多你当初没有考虑到这些数据压力同时也没有考虑到高度并发性的问题这个时候问题解决起来是你觉得比较棘手而要解决这样的问题不仅仅要专注程序 更要从系统架构方面着手综合各方面的知识进行全面的考虑
web开发常用调试工具
俗话说工欲善其石必先利其器对于程序的调试也必须借助外部工具这里介绍几种在开发web程序中常常用到的工具
xdebug xhprofphp性能调试工具他们都是php的一种扩展可以很方便的安装和配置这两个工具主要是将你程序的内部运行状况调用函数以一种简洁的方式告诉你让你对程序在什么地方占用过多的资源那些地方需要进行优化一目了然 顺便提一下xdebug生成的profile文件一般借助winCacheGrid查看
firephp firbug 前者主要是php的调试工具而后者是web开发必不可少的工具 它不仅能查看请求还能调试jscss
在ie下面可以使用HttpWatch如果需要将数据做深入分析可以使用抓包工具
php中常使用的调试函数error_report var_dump print_r var_export
mysqlapache/nginx的常用的调试技巧分析他们日志文件也是相当重要在linux下查看日志文件的常用命令 cat more less grep awk sed
常见的调试技巧和方法
下面以我调试的程序来介绍一下具体的调试方法和技巧
例子 这是一个php开发的游戏引擎主要功能提供双发球员移动位置状态传球技能等功能控制整个程序通过xml文件保存结果突然某天有两个用户进行比赛返回的xml不符合正常的结构从返回的结果来看球员的移动位置有些不正常其中少了某些步骤于是决定从游戏的AI入手查找但是也没有发现此处有什么异常最后将输入的球员数据打印出来然后将中间产生的数据也打印出来结合程序的处理逻辑发现是这两个用户有同一个球员因此导致在处理的时候 两个人的球员出现混乱找到原因后就将这个以球员标识改为以球队和球员共同决定即可
例子程序刚上线 有些热心的朋友们喜欢对程序进行一些压力测试某次突然w的请求很大的一个静态资源直接导致硬盘瘫痪对于这种情况必须查看访问日志才知道发生什么事否则人家对你攻击了 你还找不到原因当然对于这样的攻击直接把静态资源放到cdn上另外随着访问用户量的增大系统的压力增大 反应逐渐变慢我们不得不考虑以前只需要几毫秒能处理的程序现在需要几秒这个时候程序的并发性设计就很重要了否则会造成数据异常的情况
例子使用外部软件出现异常例如使用memcached的时候如果某台没有启动或者不能使用了这个时候nginx一般就会对某些使用memcache的请求返回是不是感觉有点无厘头可以考虑改写memcahce 的php扩展了