
相信很多朋友们都有调试程序的经历 然而很多时候调试程序是痛苦而又漫长的过程它不仅需要细心 更需要耐心 切忌心浮气躁 但是当找出问题并顺利解决它时 又会给人无比激动的喜悦 这里总结一下笔者在程序调试中的使用的原则 工具 以及方法 这里需要说明的是 某些原则性的东西 各种语言都是差不多的 而涉及到具体的工具和某些具体的调试方法 这里只涉及web开发方面的内容
总体原则
找出问题原因
程序需要调试 是因为程序有问题 而调试的第一目标是找到原因 常见调试方法 排除法: 当我们面对整个复杂的系统时 常常完全不知道问题出在什么地方这个时候可以先将与问题不相关的地方排排除 逐渐缩小调试范围 独立模块法: 大部分程序都有模块结构 将可疑模块单独拿出来 模拟输入相应的 *** 作数据 看是否出现问题 比较法 如果程序或系统是基于某个平台时 可以先看看其他基于本平台的程序或系统 找出是平台问题还是本程序问题 很多时候这种方法是用来排除不成熟平台上的隐藏问题 对比法 对于自己实现的程序 可能已经有相应的开源的模块 可以把这些程序源码找出来 和自己的程序进行对比 这样不仅节省时间 还能借鉴别人的优秀之处
问题定位
问题原因的多种多样 可能这个时候你只能知道是什么样的问题 可能与什么相关 这个时候就需将出现的代码段找出来 而需要做到这一步 一般开发环境为我们提供键蠢肆很多实用工具 借助这些工具 可以一步一步地查看程序的输入和输出 根据每一步的输入输出 定位问题
有一部分很厉害的人 可以通过阅读代码 找到出现问题的地方 但是很多问题都是调试者自己因为疏忽造成的 而要通过这样方式去查找问题 几乎是不可能的 因为已经形成固定的思维定势
解决问题
找到问题的原因和相应代码行 解决它很多时候是一件比较简单的事 因为这些问题往往自己疏忽或者自己考虑不周 但是某些时候并不总是这样的 而是由于外部环境造成的 比如你的网站访问的人数增多 你当初没有考虑到这些数据压力 同时也没有考虑到高度并发性的问题 这个时候问题解决起来是你觉得比较棘手 而要解决这样的问题 不仅仅要专注程序 更要从系统架构方面着手 综合各方面的知识 进行全面的考虑
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
常见的调试技巧和方法
下面以我调试的程序来介绍一下具体的调试方法和技巧
例子 这是一个php开发的游戏引擎 主要功能提供双发球员移动位置 状态 传球 技能等功能控制 整个程序通过xml文件保存结果 突然某天 有两个用户进行比赛 返回的xml不符合正常的稿轿结构 从返回的结果来看 球员的移动位置有些不正常 其中少了某些步骤 于是决定从游戏的AI入手查找 但是也没有发现此处有什么异常 最后将输入的球员数据打印出来 然后将中间产生的数据也打印出来 结合程序的处理逻辑 发现是这两个用户有同一个球员 因此导致在处理的时候 两个档返人的球员出现混乱 找到原因后 就将这个以球员标识改为以球队和球员共同决定即可
例子 程序刚上线 有些热心的朋友们喜欢对程序进行一些压力测试 某次突然 w的请求很大的一个静态资源 直接导致硬盘瘫痪 对于这种情况 必须查看访问日志 才知道发生什么事 否则人家对你攻击了 你还找不到原因 当然对于这样的攻击 直接把静态资源放到cdn上 另外 随着访问用户量的增大 系统的压力增大 反应逐渐变慢 我们不得不考虑 以前只需要 几毫秒能处理的程序 现在需要 几秒 这个时候程序的并发性设计就很重要了 否则会造成数据异常的情况
例子 使用外部软件出现异常 例如使用memcached的时候 如果某台没有启动或者不能使用了 这个时候nginx一般就会对某些使用memcache的请求返回 是不是感觉有点无厘头 可以考虑改写memcahce 的php扩展了
lishixinzhi/Article/program/PHP/201311/21278有许多 PHP 调试技术可以在编码的时候节约大量时间。一个有效却很基本的调试技术就是打开错误报告。另一个略微高级一点的技术包括使用 print 语巧稿没句,通过显示在屏幕上实际出现的内容,有助于精确地找出更难发现的 bug。PHPEclipse 是一个 Eclipse 插件,能够强调常见的语法错误,可以与调试器结合起来用于设置断点。
设置
要学习本文描述的概念,需要 PHP、Web 服务器和 Eclipse。调试器扩展支持的 PHP 版本是 V5.0.3。
我们需要一个 Web 服务器来解析用 PHP 创建的页面并把它们显示到浏览孝纳器。本文中使用的是 Apache2。但是,任何 Web 服务器都可以满足要求。
要利用本文中介绍的一些调试技术,需要安装 Eclipse V3.1.1 和插件 PHPEclipse V1.1.8。由于 Eclipse 要求 Java™ 技术,所以还要下载它。
还需要 PHP 的调试器扩展模块。安装它略有些麻烦。请仔细跟随安装调试器扩展的 *** 作说明。现在,先在 php.ini 文件中注释掉那些要求装入和配置 PHP 扩展的行。在需要使用调试器的时候,再取消注释。
请参阅 参考资料 获得下载信息。现在介绍出错消息。
出错消息
出错消息是作为开发人员的第一道防线。谁都不想在一台没有配置成显示出错消息的服务器上用 PHP 开发代码。但是,请记住,当代码调试完成,准备运行的时候,应当确保关闭了错误报告,因为不希望站点的访问者看到出错消息,因为这会给他们提供足够的信息来利用站点的弱点并黑掉站点。
也可以用出错消息为自己服务,因为它们会显示抛出或生成错误的正确代码行。这样,调试就变成在浏览器上查看生成的错误所显示的行号,并在代码中检查这一行。稍后,将会看到 PHPEclipse 插件通过即时地给语法错误加下划线并在保存文件时用红色 “x” 标注语法错误,可在开发和调试过程中提供极大的帮助。
先来看如何在 php.ini 文件中开启错误报告并设置错误报告的级别。然后将学习如何在 Apache 的配置文件中覆盖这些设置。
PHP 的错误报告
php.ini 文件中有许多配置设置。您应当已经设置好自己的 php.ini 文件并把它放在合适的目录中,就像在 Linux 上安装 PHP 和 Apache 2 的文档说明中所示的那样(请参阅 参考资料)。在调试 PHP 应用程序时,应当知道两个配置变量。下面是这两个变量及其默认值:
复制代码代码如下:
display_errors = Off
error_reporting = E_ALL
通过在 php.ini 文件中搜索它们,可以发现这两个变量当前的默认值。display_errors 变量的目的很明显 —— 它告诉 PHP 是否显示错误。默认值是 Off。但是,要让开发过程更加轻松,请把这个值设为 On:
复制代码代码如下:
display_errors = On
error_reporting 变量的默认值是 E_ALL。这个设置会显示从不良编码实践到无害提示到出错的所有信息。E_ALL 对于开发过程来说有点太细,因为它在屏幕上为一些小事(例如变量未初始化)也显示提示,会搞糟浏览器的输出。我只想看到错误和不良编码实践,但是不想看到无害的提示。所以,请用以下值代替 error_reporting 的默认值:
复制代码代码如下:
error_reporting = E_ALL &~E_NOTICE
重新启动 Apache,就全部设置好了。接下来,将学习如何在 Apache 上做同样的事。
服务敬者器上的错误报告
依赖于 Apache 正在做的工作,在 PHP 中打开错误报告可能没法工作,因为在计算机上可能有多个 PHP 版本。有时很难区分 Apache 正在使用哪个 PHP 版本,因为 Apache 只能查看一个 php.ini 文件。不知道 Apache 正在使用哪个 php.ini 文件配置自己是一个安全问题。但是,有一种方法可以在 Apache 中配置 PHP 变量,从而保证设置了正确的出错级别。
而且,最好知道如何在服务器端设置这些配置变量,以否决或抢占 php.ini 文件,从而提供更高级别的安全性。
在配置 Apache 时,应该已经接触过 <apache2-install-dir>/conf/httpd.conf 中 http.conf 文件中的基本配置。
要做在 php.ini 文件中已经做过的事,请把下列各行添加到 httpd.conf,覆盖任何 php.ini 文件:
复制代码代码如下:
php_flag display_errors on
php_value error_reporting 2039
这会覆盖在 php.ini 文件中为 display_errors 已经设置的标志,以及 error_reporting 的值。值 2039 代表 E_ALL &~E_NOTICE。如果愿意采用 E_ALL,请把值设为 2047。同样,还是要重启 Apache。
接下来,要在服务器上测试错误报告。
测试错误报告
如果启动了错误报告,会节约许多时间。PHP 中的错误会指向代码中的错误。请创建一个简单的 PHP 文件 test.php,并像清单 1 所示一样定义它。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)