xdebug配合IDE调试层经是老杨解决特殊bug的大法宝,像flash上传这种,用xdebug调试最好不过了。他适合于不确定bug在哪的情况,可以从过程中观察数据的变化。
## Xdebug的安装
首先去官网下载:
<http://xdebug.org/download.php>
![官网下载](http://box.kancloud.cn/2015-05-10_554f7107c62aa.png)
windows的下载对应php版本的dll,linux的要自己编译。
### windows上php 扩展dll的选择
用户常常会发现每个 DLL 都有好几个版本:
- 不同的版本号(至少前两个数字要一致)
- 不同的线程安全性设定
- 不同的处理器体系(x86,x64,...)
- 不同的排错设定
- 其它
请记住用户的扩展设定应该与所使用的 PHP 可执行文件的设定都保持一致。在phpinfo中我们可以轻松的看出php的版本和ts是否线程安全
### linux的php so的编译
phpize 命令是用来准备 PHP 扩展库的编译环境的。下面例子中,扩展库的源程序位于 extname 目录中:
~~~
$ cd extname
$ phpize
$ ./configure
$ make
# make install
~~~
成功的安装将创建 extname.so 并放置于 PHP 的扩展库目录中。需要调整 php.ini,加入 extension=extname.so 这一行之后才能使用此扩展库。
如果系统中没有 phpize 命令并且使用了预编译的包(例如 RPM),那要安装 PHP 包相应的开发版本,此版本通常包含了 phpize 命令以及相应的用于编译 PHP 及其扩展库的头文件。
使用 `phpize --help` 命令可以显示此命令用法。
### xdebug的配置
一般只要在php.ini
加上以下配置就行了:
~~~
[xdebug]
xdebug.remote_enable = on
xdebug.remote_port = 9000
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
~~~
保存完毕,重启别忘了重启apache
然后 phpinfo页面里看有没有出现像下图的xdebug:
![xdebug](http://box.kancloud.cn/2015-05-10_554f759e8c4cb.png)
## Netbeans的设置
##### 先打开一个本地项目:
![打开本地项目,以后面的案列freelog为例](http://box.kancloud.cn/2015-05-10_554f76da72b2c.png)
##### 配置调试时的地址:
![配置调试地址](http://box.kancloud.cn/2015-05-10_554f771d539b0.png)
**freelog.cn**是我配的vhost,当然你们也可以用**localhost**,不过不建议直接使用**localhost**。
##### 设置断点
打开项目,找到 `Home/Controller/IndexController.class.php`,随便设置两个断点
![设置断点](http://box.kancloud.cn/2015-05-10_554f77ef7a100.png)
设置断点方法是在要设置断点的行前面,代码折叠gutter 里 “单击” 鼠标左键。取消是再单击一次已有断点。
然后开始“调试该项目”:
![调试项目](http://box.kancloud.cn/2015-05-10_554f7860c3917.png)
这时候,netbeans 会 打开默认浏览器,我的是chrome。
![2015-05-10/554f78afba1cb](http://box.kancloud.cn/2015-05-10_554f78afba1cb.png)
这时候,netbeans 默认是设置在代码第一行停止,
netbeans 界面出现我这样的图,就表示xdebug 连接成功:
![2015-05-10/554f791886b16](http://box.kancloud.cn/2015-05-10_554f791886b16.png)
这是我们可以点“步过”
![步过按钮](http://box.kancloud.cn/2015-05-10_554f79477aa31.png)
一行行继续 往下调试,直到第一个断点游标行变绿:
![进入第一个断点](http://box.kancloud.cn/2015-05-10_554f79af6a5b1.png)
这时候下面已经可以看到调用堆栈了。
切断到变量页:
![变量面板](http://box.kancloud.cn/2015-05-10_554f7a2827561.png)
这时候我们已经可以看到 `$page`了,还有$Superglobals(超全局变量),以及`$this`。$page 变量的类型是Integer 整形,值为1。 `$this` 我们展开它,可以看见有view和config2个属性。
![2015-05-10/554f7acf51521](http://box.kancloud.cn/2015-05-10_554f7acf51521.png)
我们继续步过,进入到lists方法里:
![进入lists方法](http://box.kancloud.cn/2015-05-10_554f7b297e874.png)
又可以看到下面的变量值。
当我们所有断点都执行过后,点绿色的“继续”按钮:
![2015-05-10/554f7b70286e0](http://box.kancloud.cn/2015-05-10_554f7b70286e0.png)
走完调试index 控制器的index方法。这时候浏览器里的页面就正常了:
![正常演示项目首页](http://box.kancloud.cn/2015-05-10_554f7b9f6ad6e.png)
调试就结束了。当然如果你一开始没设定对断点,有可能没走到你想要的地方。
你可以随时添加,只要不结束调试,刷新一下那个 带netbean session参数的页面,只要能继续访问你想要的控制器,比方ajax 上传文件,再次操作。还会进调试的断点。
所以一般我都是多设几个断点,几次调试后无关行数的断点再关闭。这样省点事。
当我们觉得不必要调试了。我们就可以点红色“终止”按钮:
![2015-05-10/554f7c7bc3db2](http://box.kancloud.cn/2015-05-10_554f7c7bc3db2.png)
浏览器出现:
![2015-05-10/554f7ca06b0dd](http://box.kancloud.cn/2015-05-10_554f7ca06b0dd.png)
就表示调试结束了。
- 序
- 前言
- 内容简介
- 目录
- 基础知识
- 起步
- 控制器
- 模型
- 模板
- 命名空间
- 进阶知识
- 路由
- 配置
- 缓存
- 权限
- 扩展
- 国际化
- 安全
- 单元测试
- 拿来主义
- 调试方法
- 调试的步骤
- 调试工具
- 显示trace信息
- 开启调试和关闭调试的区别
- netbeans+xdebug
- Socketlog
- PHP常见错误
- 小黄鸭调试法,每个程序员都要知道的
- 应用场景
- 第三方登录
- 图片处理
- 博客
- SAE
- REST实践
- Cli
- ajax分页
- barcode条形码
- excel
- 发邮件
- 汉字转全拼和首字母,支持带声调
- 中文分词
- 浏览器useragent解析
- freelog项目实战
- 需求分析
- 数据库设计
- 编码实践
- 前端实现
- rest接口
- 文章发布
- 文件上传
- 视频播放
- 音乐播放
- 图片幻灯片展示
- 注册和登录
- 个人资料更新
- 第三方登录的使用
- 后台
- 微信的开发
- 首页及个人主页
- 列表
- 归档
- 搜索
- 分页
- 总结经验
- 自我提升
- 进行小项目的锻炼
- 对现有轮子的重构和移植
- 写技术博客
- 制作视频教程
- 学习PHP的知识和新特性
- 和同行直接沟通、交流
- 学好英语,走向国际
- 如何参与
- 浏览官网和极思维还有看云
- 回答ThinkPHP新手的问题
- 尝试发现ThinkPHP的bug,告诉官方人员或者push request
- 开发能提高效率的ThinkPHP工具
- 尝试翻译官方文档
- 帮新手入门
- 创造基于ThinkPHP的产品,进行连带推广
- 展望未来
- OneThink
- ThinkPHP4
- 附录