XDEBUG 从入门到精通

前言

Xdebug是PHP的扩展,用于协助调试和开发。 – 它包含一个用于IDE的调试器 – 它升级了PHP的var_dump()函数 – 它为通知,警告,错误和异常添加了堆栈跟踪 – 它具有记录每个函数调用和磁盘变量赋值的功能 – 它包含一个分析器 – 它提供了与PHPUnit一起使用的代码覆盖功能。

猿生必备的工具。 但不推荐在生产环境中使用xdebug,因为他太重了。

安装

PECL 安装

pecl install xdebug
zend_extension="/usr/local/php/modules/xdebug.so"

源码包安装

https://xdebug.org/download.php 寻找对应的包

wget xxx.gz
./configure
make && make install
zend_extension="/usr/local/php/modules/xdebug.so"

Docker安装

以下为php dockerfile内部分内容

RUN pecl install xdebug
RUN echo 'zend_extension=xdebug.so' >> /usr/local/etc/php/conf.d/xdebug.ini

工作原理

IDE(如PHPStorm)已经集成了一个遵循BGDP的XDebug插件,当开启它的时候, 会在本地开一个XDebug调试服务,监听在调试器中所设置的端口上,默认是9000,这个服务就会监听所有到9000端口的链接。

当浏览器发送一个带 XDEBUG_SESSION_START 的参数的请求到服务器时,服务器接受后将其转到后端的php处理,如果php开启了XDebug模块,则会将debug信息转发到客户端IP的IDE的调试端口上。

当参数或者cookie信息中不带 XDEBUG_SESSION_START ,则不会启动调试。这就为后续在浏览器中添加开关提供了可能。

基本配置

一般情况下,你都只需了解,无需修改。

名称

类型

默认值

注解

xdebug.default_enable

boolean

1

堆栈跟踪,默认开启,是xdebug基础功能之一

xdebug.force_display_errors

integer

0

默认关闭,如果这个设置设置为1,那么无论PHP的display_errors设置为什么,都将始终显示错误。

xdebug.force_error_reporting

integer

0

默认关闭,允许强制显示某些错误

xdebug.halt_level

integer

0

默认关闭,设置接收某些指定错误

xdebug.max_nesting_level

integer

256

控制无限递归(死循环)的保护机制,默认是256

xdebug.max_stack_frames

integer

-1

控制有多少堆栈帧显示在堆栈跟踪中,在PHP错误堆栈跟踪的命令行中,以及在浏览器中显示HTML跟踪。

xdebug.scream

boolean

0

默认关闭,如果该设置为1,那么Xdebug将禁用@(关闭)操作符,以便不再隐藏通知、警告和错误。

具体内容请移步官网 https://xdebug.org/docs/basic

打印配置

Xdebug将替换PHP的var_dump()函数来显示变量。Xdebug版本包含了不同类型的不同颜色,并对数组元素/对象属性的数量、最大深度和字符串长度进行了限制。还有一些其他函数也处理变量显示。

名称

类型

默认值

注解

xdebug.cli_color

integer

0

cli模式下输入结果是否设置颜色

xdebug.overload_var_dump

boolean

2

是否允许xdebug重载var_dump函数

xdebug.var_display_max_children

integer

128

var_dump 对数组对象子级的显示层数限制

xdebug.var_display_max_data

integer

512

var_dump 对结果长度的限制

xdebug.var_display_max_depth

integer

3

var_dump 对默认显示嵌套的层数的限制

具体内容请移步官网 https://xdebug.org/docs/display

堆栈跟踪配置

当Xdebug被激活时,当PHP决定显示一个通知、警告、错误等时,它将显示一个堆栈跟踪。堆栈跟踪显示的信息以及它们的显示方式可以配置为适合您的需要。

名称

类型

默认值

注解

xdebug.cli_color

integer

0

cli模式下输入结果是否设置颜色

xdebug.collect_includes

boolean

1

控制Xdebug是否应该将include()、include_once()、require()或require_once()中的文件名写入跟踪文件

xdebug.collect_params

integer

0

该设置默认为0,控制当函数跟踪或堆栈跟踪记录函数调用时,Xdebug是否应该收集传递给函数的参数

xdebug.collect_vars

boolean

0

这个设置告诉Xdebug在特定范围内使用哪些变量。由于Xdebug必须逆向工程PHP的操作码数组,这种分析可能相当缓慢。对于使用xdebug.collect_params,此设置不会记录不同变量的值。只有当您希望使用xdebug_get_declared_vars()时,才需要启用此设置。

xdebug.dump.*

string

empty

* 可以是任何COOKIE、文件、GET、POST、REQUEST、SERVER、SESSION。这七个设置控制在发生错误时显示来自超全局变量的哪些数据。

xdebug.dump_globals

boolean

1

当该设置设置为true时,Xdebug将添加通过Xdebug.dump配置的超级全局变量的值*到屏幕上的堆栈跟踪和错误日志。

xdebug.dump_once

boolean

1

控制是否应该在所有错误情况(设置为0)上转储超全局变量的值,或只在第一个错误情况下转储超全局变量的值(设置为1)

xdebug.dump_undefined

boolean

0

如果您想从超全局变量中转储未定义的值,您应该将该设置设置为1,否则将其设置为0。

xdebug.file_link_format

string

文件链接格式

具体内容请移步官网 https://xdebug.org/docs/stack_trace

函数调试配置

Xdebug允许记录所有函数调用,包括参数和以不同格式返回的值。

名称

类型

默认值

注解

xdebug.auto_trace

boolean

0

当将此设置设置为ture时,将在脚本运行之前启用函数调用的跟踪

xdebug.collect_assignments

boolean

0

该设置默认为0,控制Xdebug是否应该向函数跟踪添加变量赋值。

xdebug.collect_includes

boolean

1

该设置默认为1,控制Xdebug是否应该将include()、include_once()、require()或require_once()中的文件名写入跟踪文件。

xdebug.collect_params

integer

0

该设置默认为0,控制当函数跟踪或堆栈跟踪记录函数调用时,Xdebug是否应该收集传递给函数的参数。

xdebug.collect_return

boolean

0

该设置默认为0,控制Xdebug是否应该将函数调用的返回值写入跟踪文件。

xdebug.show_mem_delta

integer

0

Xdebug生成的跟踪文件将显示函数调用之间内存使用的差异

xdebug.trace_format

integer

0

跟踪文件的格式

xdebug.trace_options

integer

0

当设置为“1”时,跟踪文件将被附加到后面的请求中,而不是被覆盖。

xdebug.trace_output_dir

string

/tmp

写入跟踪文件的目录,确保PHP运行的用户具有该目录的写权限。

具体内容请移步官网 https://xdebug.org/docs/execution_trace

垃圾收集统计信息

Xdebug的内置垃圾收集统计信息分析器允许您查明PHP内部垃圾收集器何时触发、它能够清理多少变量、它花费了多长时间以及实际释放了多少内存。

名称

类型

默认值

注解

xdebug.gc_stats_enable

bool

false

如果启用此设置,则垃圾收集运行的统计信息将自动收集到使用xdebug.gc_stats_output_dir设置的给定目录中, 并使用由xdebug.gc_stats_output_name配置的自动生成的名称。

xdebug.gc_stats_output_dir

string

/tmp

将写入垃圾收集统计信息输出的目录,确保将运行PHP的用户具有对该目录的写入权限。无法使用ini_set() 在脚本中设置此设置。

xdebug.gc_stats_output_name

string

gcstats.%p

此设置确定用于将垃圾回收统计信息转储到的文件的名称。该设置使用格式说明符指定格式,与sprintf() 和strftime() 非常相似。有几种格式说明符可用于格式化文件名。

具体内容请移步官网 https://xdebug.org/docs/garbage_collection

远程调试配置

Xdebug为与运行PHP脚本交互的调试器客户机提供了一个接口。

名称

类型

默认值

注解

xdebug.extended_info

integer

1

控制Xdebug是否应该为PHP解析器强制执行’extended_info’模式; 这允许Xdebug使用远程调试器执行文件/行断点。在跟踪或分析脚本时,您通常希望关闭此选项,因为PHP生成的oparray将增加大约三分之一的大小,从而减慢脚本速度。无法使用ini_set()在脚本中设置此设置,但只能在php.ini中设置。

xdebug.idekey

string

complex

控制哪些IDE Key Xdebug应传递给DBGp调试器处理程序。则与客户端通信的key

xdebug.remote_addr_header

string

“”

该值将用作$SERVER超全局数组中的键,以确定用于查找用于“连接回”的IP地址或主机名的标头

xdebug.remote_autostart

boolean

0

您需要使用特定的HTTP GET / POST变量来启动远程调试

xdebug.remote_connect_back

boolean

0

如果你不设置ip地址,就只能靠xdebug自己找了,Xdebug将尝试连接到发出HTTP请求的客户端。它检查$_SERVER[‘HTTP_X_FORWARDED_FOR’]和$_SERVER[‘REMOTE_ADDR’]变量以找出要使用的IP地址

xdebug.remote_cookie_expire_time

integer

3600

设置cookie的生命周期

xdebug.remote_enable

boolean

0

是否开启远程调试

xdebug.remote_handler

string

dbgp

调试的通信协议

xdebug.remote_host

string

localhost

调试的网络地址,开启了remote_connect_back后,当前配置就无效了

xdebug.remote_log

string

调试的日志

xdebug.remote_port

integer

9000

调试的端口

xdebug.remote_timeout

integer

200

调试的通信链接的等待时间

具体内容请移步官网 https://xdebug.org/docs/remote

官方链接

全部配置请移步官网 https://xdebug.org/docs/all_settings 全部函数请移步官网 https://xdebug.org/docs/all_functions

PHPSTORM DEBUG

网络上的配置DEBUG文章太杂太乱,在PHPSTROM跳来跳去的,实在让人心烦意乱,本章重新整理描述。

配置

其实在PHPSTROM中已经出了很详细的教程,是吧?只不过大部分人都会直接百度/Google,查询是个好习惯,但要视情况而定。

Languages & Frameworks > PHP > Debug

第一步

下载XDEBUG扩展,本章开头已经讲过了,这里不再阐述。 在安装完成后,PHPSTROM提供了验证脚本。脚本地址为 https://gist.github.com/litzinger/8fd06ab6e5033b7ff8d8 正常情况下检测成功的样子是

看到这个你就可以放心的去debug了。

第二步

装个浏览器插件,用户请求监听。这个东西唯一的作用就是方便了debug,正常如果不安装的话你需要通过GET传参XDEBUG_SESSION_START=ID_KEY 才可以,安装插件后就不需要了。

你可以自行选择是否开启debug,以下为浏览器插件列表

浏览器

下载

Chrome

Xdebug Helper

Firefox

The easiest Xdebug or Xdebug Helper

Safari

Xdebug Toggler

Opera

Xdebug launcher

Internet Explorer

PhpStorm bookmarklets generator

第三步

开启监听即可。

你可以直接点击图片上的监听按钮。

到现在为止,就配置好了IDE。

第四步

创建DEBUG配置文件,根据每个项目都要配置。这步你跑不了。

你看,PHPSTORM非常人性化,在每一步都会给你出个简单的教程来描述如何配置DEBUG。

添加一个Server和IDE key(xdebug.idekey) 就可以进行调试了。

总结

总结以下IDE配置DEBUG的步骤,实际很简单。

  1. 下载安装debug
  2. 验证是否通信正常
  3. 添加浏览器插件 (可省略)
  4. 配置运行文件
  5. 愉快的debug

这里还要说明下,如果你是不需要访问本机调试一些类或者代码块,你只需要在本机上安装好XDEBUG,上述配置全部省略,直接点小虫子图标即可调试。DEBUG端口默认是9000,如果配置文件内修改了,当然在IDE内也需要修改下。

调试

介绍下实际DEBUG过程中PHPSTORM面板的按钮都是做什么用的。当你启动监听后,你将会看到如下图

根据上图图标位置,以x,y坐标的方式描述每个图标的功能。

图标

位置 (x,y)

功能

0,0

重新执行DEBUG (Rerun test.php)

0,1

跳转到原调试文件 (Show execution point)

0,2

跳到下一行 (Step over)

0,3

执行下一步 (Step info)

0,4

跳入库、构造函数等方法或类中 (Force Step Info)

0,5

执行函数体或类方法,如果在最外层则结束本次调试 (Step out)

0,6

跳到当前节点的下个断点 (Run to Cursor)

0,7

执行修改变量或返回的结果用于二次调试(Evaluate arbitrary expression)

0,8

显示值的地址 (Show Values Addresses)

0,9

是否显示空的值 , 默认是不显示

0,10

跳到下个断点 (Add method to skip list)

1,0

重新执行DEBUG (Resume Program)

2,0

停止DEBUG(Step process)

3,0

查看和管理所有的断点 ( View and manage all breakpoints)

4,0

忽略所有断点 (Mute breakpoints)

其他

Docker PHP XDEBUG

部分人在本机装了Docker,容器中运行这PHP,这个时候该如何进行DEBUG呢?如果认真看本篇文章,你会发现十分的简单。本身XDEBUG就是远程调试。首先你要保证

  • 容器做了端口映射到本机80
  • 容器内项目目录做了磁盘挂载

将容器PHP XDEBUG 中

xdebug.remote_host=local_ip

即可,也不用担心hosts文件的问题

本机IP = 127.0.0.1 = localhost

这样配置完成后,就可以当容器不存在,与本机调试一样。

致谢

感谢你看到这里,希望本章内容可以帮到你,谢谢。

最后修改:2天前

© 著作权归作者所有

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏有趣的django

Django用户登录与注册系统

一、创建项目 1.1.创建项目和app django-admin startproject mysite_login python manage.py sta...

2.4K70
来自专栏吴伟祥

Linux 文件与目录管理 转

pwd是Print Working Directory的缩写,也就是显示目前所在目录的命令。

13940
来自专栏芋道源码1024

分布式事务 TCC-Transaction 源码分析 —— 事务恢复

1. 概述 本文分享 TCC 恢复。主要涉及如下二个 package 路径下的类: org.mengyun.tcctransaction.recover Rec...

42330
来自专栏用户2442861的专栏

IntelliJ IDEA配置Spark使用

第二步下载插件 首先启动intelliJ IDEA:在命令行终端中,进入$IDEA_HOME/bin目录,输入./idea.sh进行启动,进入如下界面,然后...

60310
来自专栏windealli

常用压测工具

webbench 是常用的网站压力测试工具,webbench用C语言编写,代码仅有区区几百行。

1.1K50
来自专栏程序员互动联盟

【专业技术】8大你不得不知的Android调试工具

1. 查看当前堆栈 1) 功能:在程序中加入代码,使可以在logcat中看到打印出的当前函数调用关系 2) 方法: new Exception(“print ...

724130
来自专栏丑胖侠

Zookeeper开源客户端Curator之基本功能讲解

简介 Curator是Netflix公司开源的一套Zookeeper客户端框架。了解过Zookeeper原生API都会清楚其复杂度。Curator帮助我们在其基...

39850
来自专栏腾讯云Elasticsearch Service

logstash input插件开发

logstash作为一个数据管道中间件,支持对各种类型数据的采集与转换,并将数据发送到各种类型的存储库,比如实现消费kafka数据并且写入到Elasticsea...

83640
来自专栏猿人谷

使用asp调用.net xml web services

(是不是实际上可以用这个办法调用任何xml web services呢?高人答一下) 最近在做一个web services,由我来写文档。为了方便广大asp用户...

29970
来自专栏游戏杂谈

Operation could not be completed. (WebKitErrorDomain error 101.)

ios中加载网页,会报如标题所示的错误“Operation could not be completed. (WebKitErrorDomain error ...

20910

扫码关注云+社区

领取腾讯云代金券