PHP调试跟踪之XDebug使用总结:
Xdebug是一个开源的PHP程序调试工具,可以使用它来调试、跟踪及分析程序运行状态。当然,Xdebug需要结合PHP的编辑工具来打断点、跟踪、调试及分析,比较常用的PHP的Xdebug调试环境:Vim +Xdebug。
· 安装配置
· 调试环境
· 跟踪分析
· 注意事项
· 遇到问题
一、安装配置
Xdebug的安装是作为PHP的拓展而存在的,所以可参考PHP拓展文章:
http://blog.csdn.net/why_2012_gogo/article/details/51120645
php.ini:
[xdebug]
;基本调试配置
xdebug.auto_trace = on
xdebug.collect_params = on
xdebug.collect_return = on
xdebug.profiler_enable = on
xdebug.profiler_output_dir ="/php/ext/xdebug_profilers"
xdebug.trace_output_dir = "/tmp/ext/xdebug_traces"
;远程调试设置
xdebug.remote_enable = on
xdebug.remote_host = localhost
xdebug.remote_port = 9010
xdebug.remote_autostart = on
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so
NOTE:
上面罗列的是最为常用的配置选项,至于其他配置选项及对应的含义,请参考:
https://xdebug.org/docs/all_settings#auto_trace
二、调试环境
Vim + Xdebug:
http://www.vim.org/scripts/script.php?script_id=1929
$ cd ~
$ sudo mkdir ~/.vim
将上面下载的xdebug的plugin中文件复制到.vim下:
$ sudo cp –r /php/ext/plugin .
在用户主目录下创建.vimrc文件:
$ sudo touch /usr/share/vim/vimrc ~/.vimrc
$ sudo vim ~/.vimrc
为.vimrc添加以下内容:
let g:debuggerPort = 9010(该端口必须与xdebug.remote_port相同)
let g:debuggerMaxDepth = 5(代表数组调试深度配置)
NOTE:
vimrc文件是vim的主要配置文件,它包含两个版本:全局版本和用户版本,我们建议修改用户版本的vimrc配置文件,这两种版本的路径可在vim普通模式下查看,如下:
全局版本路径查看:
$ sudo vim
$ :echo $VIM
路径地址:/usr/share/vim
用户版本路径查看:
$ sudo vim
$ :echo $HOME
路径地址:$HOME(pwd ~)
g:debuggerPort的端口号,必须与xdebug.remote_port相同;
g:debuggerMaxDepth代表的是脚本调试的最大深度层次;
最后,修改完php.ini、.vimrc配置后,记得重启php-fpm。
A、准备一个php文件
$value = '马上使用XDebug调试程序,你准备好了吗';
echo
$value;
将上面的文件放入到你的Web根目录下,我的访问地址是:
http://localhost/xdebug.php
测试下是否正常显示。
B、使用vim打开php文件
使用vim普通模式打开php文件,移动鼠标箭头到欲调试的那行,输入:
截图如下:
然后,按下F5(Mac:Fn+F5),开始监听调试事件,这时在编辑窗底部提示5秒内访问要调试的php文件,例如:
http://localhost/xdebug.php
? XDEBUG_SESSION_START=1
截图如下:
对于调试中的操作在下面附加上:
类型
|
功能
|
说明
|
<Command Mode>
|
|
|
:Bp
|
toggle breakpoint
|
断点标记
|
:Up
|
stack up
|
|
:DN
|
stack down
|
|
<Normal Mode>
|
|
|
,e
|
eval
|
|
<Function Keys>
|
|
|
F1
|
resize
|
调整窗口大小
|
F2
|
step into
|
调试步进入
|
F3
|
step over
|
调试步进入下一标记
|
F4
|
step out
|
调试步出当前标记
|
F5
|
run
|
调试运行
|
F6
|
quit debugging
|
退出调试模式
|
F11
|
get all context
|
获得所有变量内容
|
F12
|
get property of cursor
|
获得当前光标变量
|
三、跟踪分析
1、代码覆盖分析
Xdebug 2.2开始支持对代码覆盖的分析,也就是通过对代码的覆盖分析,我们可以了解到在IDE访问期间,有哪些代码行数被执行了,有助于对核心代码和单元测试有针对性的了解和分析,最终提高代码的质量。
A、涉及的配置
xdebug.coverage_enable=1
//该配置默认为1,也就是默认开启,如果设置为0,代码的覆盖分析就不会进行。
B、涉及的函数
boolean
xdebug_code_coverage_started()
//该函数返回布尔值,用来判断代码覆盖分析功能是否开启,未开启则返回false。
void
xdebug_start_code_coverage(
[int options]
)
//该函数没有任何返回,它的作用是开始搜集分析结果集数据,数据是以二维数组形势//存在,一维参数为分析的文件名字,二维参数为对应的分析行数;另外,在分析文件
//的每行代码时,都会产生一个结果码,如下:
//1:代表代码已经执行;
//-1:代表代码未被执行,对应函数参数XDEBUG_CC_UNUSED传入;
//-2:代表没有可执行的代码存在,对应XDEBUG_CC_DEAD_CODE和XDEBUG_CC_UNUSED
NOTE:
XDEBUG_CC_UNUSED:用来计算分析时包含搜集未被执行的代码;
XDEBUG_CC_DEAD_CODE:用来计算分析时代码行是否被执行;
形式如下:
xdebug_start_code_coverage(XDEBUG_CC_UNUSED|XDEBUG_CC_DEAD_CODE);
array
xdebug_get_code_coverage()
//该函数返回数组值,用来搜集和返回代码覆盖分析的结果集信息。
void
xdebug_stop_code_coverage(
[int cleanup=true]
)
//该函数不返回任何值,用来停止覆盖分析,如果传入参数为true,那么就会停止分析并清空内存中的分析结果集,否者传入false,反之,还可使用//xdebug_start_code_coverage找回该内存信息。
C、示例的验证
Php代码:
echo '覆盖分析进行中...</br>';
// 构建封装对象
class XdebugCoverageAnalysisModel {
private $_coverage_info;
private $_status;
function __construct() {
$this->_coverage_info = xdebug_get_code_coverage();
$this->_status =xdebug_code_coverage_started();
// 获取分析结果
public functiongetCodeCoverageResult() {
returnjson_encode(xdebug_get_code_coverage());
// 开启覆盖分析
public functionxdebugStartCodeCoverage() {
xdebug_start_code_coverage( -1 | -2 );
// 分析是否执行
public functionxdebugCodeStarted() {
return xdebug_code_coverage_started();
// 初始化
$apiModel = new XdebugCoverageAnalysisModel();
echo '开启覆盖分析...</br>';
$apiModel->xdebugStartCodeCoverage();
// 定义一个测试函数
function coverageSample($a,$b) {
echo '函数结果:'.($a * $b).'</br>';
echo '判断是否开启...</br>';
$status = $apiModel->xdebugCodeStarted();
if($status=='1') {
echo '开启覆盖分析已完成</br>';
} else {
echo '开启覆盖分析失败了</br>';
echo '测试函数开启...</br>';
coverageSample(10,10);
echo '获取分析结果...</br>';
$result = $apiModel->getCodeCoverageResult();
echo $result.'</br>';
echo '关闭分析开关...</br>';
xdebug_stop_code_coverage();
$status = $apiModel->xdebugCodeStarted();
if($status=='1') {
echo '覆盖分析已经完成</br>';
} else {
echo '覆盖分析已经关闭!</br>';
unset($result);
unset($apiModel);
浏览器结果:
2、PHP脚本分析
Xdebug的PHP脚本分析功能比较实用,它可以帮助我们分析代码的瓶颈和影响性能缓慢的问题,为优化代码提供可行性的参考。
A、涉及的配置
xdebug.profiler_enable
//该配置默认为0,为开启,设置为非0之后,即开启profiler功能
xdebug.profiler_output_dir
//该配置为上面开启之后,存放生成分析文件的位置,需要保证位置可写入,默认/tmp
xdebug.profiler_enable_trigger
//如果开启该选项,则在每次请求中如果GET/POST或cookie中包含//XDEBUG_PROFILE变量名,则才会生成性能报告文件(前提是必须关闭
//xdebug.profiler_enable选项,否则该选项不起作用)。
xdebug.profiler_output_name
//可以使用该配置修改生成的分析文件,默认
cachegrind.out.%p
NOTE:
建议使用
xdebug.profiler_enable_trigger
替代
xdebug.profiler_enable
。
B、涉及的函数
string
xdebug_get_profiler_filename()
//返回类型为字符串,用来返回分析的文件名字
C、示例的验证
当我们开启分析开关之后,当有脚本运行就会在指定的位置生成格式为cachegrind.out.xxx的分析文件:
该文件的内容不是很直观,所以需要使用可视化的工具来查看和分析,而Xdebug本身就支持使用第三方的可视化profiler文件的内容。在Linux下,可以使用KCacheGrind,而在Windows平台,可以使用QCacheGrind,当然还有一些在线的由爱好者开发的工具,例如:WebGrind,具体怎样使用这些工具,可以参考:
https://xdebug.org/docs/profiler
下面罗列下,WebGrind的效果:
WebGrind可以在这里下载:
https://github.com/jokkedk/webgrind
四、注意事项
1、避免生产环境开启profiler和trace,只需开启远程调试;
2、尽量使用
xdebug.profiler_enable_trigger
替代xdebug.profiler_enable;
3、如果使用webgrind分析profiler,建议不要放入生产环境,因为其没有安全限制,任何人都可以访问;
4、Xdebug的功能虽然强大,但是要均衡性能开销;
五、遇到问题
问题:Error("DbgProtocol instance has no attribute 'stop'",)
产生该问题的原因大致如下:
A、配置文件配置不正确;
B、.vimrc和php.ini中的port不相同;
C、.vimrc和php.ini中的port与现有的port冲突;
对照上面的几条仔细查看配置即可。
NOTE:
有博客说因为未在URL后添加XDEBUG_SESSION_START=1,其实不然。
技术讨论群:489451956
(新)
Xdebug是一个开源的PHP程序调试工具,可以使用它来调试、跟踪及分析程序运行状态。当然,Xdebug需要结合PHP的编辑工具来打断点、跟踪、调试及分析,比较常用的PHP的Xdebug调试环境:Vim + Xdebug。• 安装配置• 调试环境• 跟踪分析• 注意事项• 遇到问题
RUN set -ex; \
wget http://
xdebug
.org/files/
xdebug
-2.8.0.tgz; \
tar -xzvf
xdebug
-2.8.0.tgz; \
cd ./
xdebug
-2.8.0; \
php
ize; \
./configure --enable-
xdebug
; \
make && make install
COPY
xdebug
.ini /usr/local/etc/
php
/conf.d/ma
为什么需要Debugger?
很多
PHP
程序员
调试
使用
echo、print_r()、var_dump()、printf()等,其实对 于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中,通过输出特定变量的值可以判断程序执行是否正确,甚至效率高低也可以 看出来(当然可能还需要
使用
一些时间函数)。那么我们为什么还需要一个专门的
调试
程序来监控我们的程序运行呢? 这个问题的答案不妨留到后面来揭晓。
什么是
Xdebug
?
Xdebug
是一个开放源代码的
PHP
程序
调试
器(即一个Deb.
Xdebug
是一个开源的
PHP
程序代码
调试
工具,可以用来
跟踪
、
调试
和分析
PHP
程序的运行状况。大多数情况下,它是作为
PHP
的一个扩展模块来运行的。
下载
Xdebug
模块
到目前为止,
Xdebug
的最新版本为2.2.4,你可以前往
Xdebug
官方网站下载与自己的
PHP
版本
之前整理在印象笔记中,现在搬出来。分本地
调试
和远程
调试
。本文亲测通过并截图,有问题欢迎留言探讨。
(参考网上多位前辈的博客,整理在笔记里忘记保存原文链接,这里无法贴出链接,望见谅)
一般
php
项目
调试
都用echo, var_dump()之类的函数
调试
,项目大的话很不方便,也很低效;
安装
xdebug
扩展;
官网https://
xdebug
...
### 回答1:
Xdebug
是一个用于
PHP
的
调试
器和分析器。它可以帮助您
跟踪
代码执行、查看变量值和调用堆栈等。要
使用
Xdebug
,您需要在
PHP
中安装和配置它。步骤如下:
1. 下载并安装
Xdebug
扩展。
2. 编辑
php
.ini 配置文件,启用
Xdebug
扩展。
3. 设置 IDE 或编辑器来
使用
Xdebug
。
4.
使用
Xdebug
进行
调试
。
如果您
使用
的是 Windows 系统,可以
使用
PECL 命令安装
Xdebug
:
pecl install
xdebug
如果您
使用
的是 Linux 系统,可以
使用
以下命令安装
Xdebug
:
sudo apt-get install
php
-
xdebug
然后,编辑
php
.ini 文件启用
Xdebug
扩展:
zend_extension = /usr/lib/
php
/20151012/
xdebug
.so
并设置 IDE 或编辑器来
使用
Xdebug
进行
调试
,例如在
Php
Storm中设置即可。
如果您想了解更多关于
Xdebug
的信息,请访问官网:https://
xdebug
.org/
### 回答2:
PHP
Xdebug
是一个用于
调试
PHP
程序的工具。它提供了一些强大的功能,帮助开发人员在开发和
调试
过程中更加高效地查找和解决问题。
使用
Xdebug
的第一步是将其安装到
PHP
环境中。一般来说,可以通过厂商提供的包管理器(如 PECL),或者手动下载源代码编译安装。安装完成后,需要在
PHP
配置文件中启用
Xdebug
扩展。
一旦安装和启用
Xdebug
,我们就可以开始
使用
其提供的功能了。其中最常用的功能是代码断点
调试
。我们可以在代码中设置断点,当程序执行到断点时会停下来,然后可以逐行查看代码的执行路径、变量的值以及调用堆栈等信息。可以
使用
调试
器(如
Php
Storm、NetBeans 或者
Xdebug
自带的命令行工具)来与
Xdebug
进行交互。
除了断点
调试
,
Xdebug
还提供了一些辅助功能。例如,它可以生成代码覆盖率报告,帮助我们了解代码的执行情况以及哪些部分没有被覆盖到。另外,
Xdebug
还可以记录函数的调用时间和内存消耗,用于性能分析和优化。
为了更好地
使用
Xdebug
,我们可以在
PHP
配置文件中进行一些配置。我们可以设置远程
调试
(Remote Debugging),允许通过网络连接到远程服务器进行
调试
。我们还可以设置日志记录(Logging),将
调试
信息写入日志文件,以便以后分析。
总之,
PHP
Xdebug
是一个非常实用的工具,可以帮助开发人员更加高效地进行
PHP
程序的
调试
。
使用
Xdebug
可以快速定位和解决问题,并提高代码的质量和性能。
### 回答3:
PHP
Xdebug
是一个可以提供
调试
、分析和优化
PHP
程序的强大工具。它为开发者提供了一系列的功能,帮助我们更方便地进行代码
调试
和性能分析。
首先,
Xdebug
提供了强大的
调试
功能,可以让我们在
PHP
程序中设置断点,然后逐行
调试
代码。通过启用
Xdebug
,我们可以在代码中插入断点,以便在执行到断点时暂停程序并检查变量的值以及代码执行流程。这对于定位代码中的错误和
调试
复杂的程序非常有帮助。
此外,
Xdebug
还可以生成详细的运行时日志,可以帮助我们追踪程序的执行流程和变量的变化。我们可以通过在配置文件中设置相应的参数,让
Xdebug
追踪和记录程序的每一步操作,以及输出和记录变量的值。这对于分析程序的执行顺序和检查变量的变化非常有用,可以帮助我们更好地了解程序的行为。
除了
调试
和日志功能,
Xdebug
还提供了一系列的性能分析功能。它可以生成函数调用图,并统计函数的执行时间和调用次数,从而帮助我们发现程序中的性能瓶颈。通过分析
Xdebug
生成的报告,我们可以定位到执行时间较长的函数,并优化它们以提高程序的性能。
总结
来说,
PHP
Xdebug
是一个非常有用的工具,它可以帮助我们更好地
调试
、分析和优化
PHP
程序。通过
使用
Xdebug
,我们可以快速地定位代码中的错误,了解程序的执行流程和变量的变化,以及发现和优化程序的性能瓶颈。它是
PHP
开发者不可或缺的一款工具。