PHP如何打印跟踪调试信息

目录
  • debug_backtrace()
  • debug_print_backtrace()
  • 总结

对于大部分编译型语言来说,比如 C 、 Java 、 C# ,我们都能很方便地进行断点调试,但是 PHP 则必须安装 XDebug 并且在编辑器中进行复杂的配置才能实现断点调试的能力。不过,如果只是简单的调试并且查看堆栈回溯的话,其实 PHP 已经为我们准备好了两个函数,能够让我们非常方便的看到程序运行时的调用情况。

debug_backtrace()

从这个方法的字面意思上就可以看出,它的意思就是调试回溯,返回的也正是一段回溯信息的数组。

function a_test($str)
{
    echo "Hi: $str", PHP_EOL;
    var_dump(debug_backtrace());
}

var_dump(debug_backtrace());

a_test("A");

// Hi: A/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:7:
// array(1) {
//   [0] =>
//   array(4) {
//     'file' =>
//     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
//     'line' =>
//     int(12)
//     'function' =>
//     string(6) "a_test"
//     'args' =>
//     array(1) {
//       [0] =>
//       string(1) "A"
//     }
//   }
// }

这个方法必须在函数中调用,在函数方法外部使用是不会有内容的。从内容中看,它输出了关于这个函数的 __FILE__ 、 __LINE__ 、 __FUNCTION__ 、$argv 等信息。其实就是关于当前打印这行所在函数的相关内容。

我们当然也可以多嵌套几层函数来看一下打印出的内容是什么。

function b_test(){
    c_test();
}

function c_test(){
    a_test("b -> c -> a");
}

b_test();

// Hi: b -> c -> a
// /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:7:
// array(3) {
//   [0] =>
//   array(4) {
//     'file' =>
//     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
//     'line' =>
//     int(37)
//     'function' =>
//     string(6) "a_test"
//     'args' =>
//     array(1) {
//       [0] =>
//       string(11) "b -> c -> a"
//     }
//   }
//   [1] =>
//   array(4) {
//     'file' =>
//     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
//     'line' =>
//     int(33)
//     'function' =>
//     string(6) "c_test"
//     'args' =>
//     array(0) {
//     }
//   }
//   [2] =>
//   array(4) {
//     'file' =>
//     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
//     'line' =>
//     int(40)
//     'function' =>
//     string(6) "b_test"
//     'args' =>
//     array(0) {
//     }
//   }
// }

没错,数组的输出顺序就是一个栈的执行顺序,b_test() 最先调用,所以它在栈底,对应的输出也就是数组中的最后一个元素。

在类中也是类似的使用方法。

class A{
    function test_a(){
        $this->test_b();
    }
    function test_b(){
        var_dump(debug_backtrace());
    }
}

$a = new A();
$a->test_a();

// /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:90:
// array(2) {
//   [0] =>
//   array(7) {
//     'file' =>
//     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
//     'line' =>
//     int(87)
//     'function' =>
//     string(6) "test_b"
//     'class' =>
//     string(1) "A"
//     'object' =>
//     class A#1 (0) {
//     }
//     'type' =>
//     string(2) "->"
//     'args' =>
//     array(0) {
//     }
//   }
//   [1] =>
//   array(7) {
//     'file' =>
//     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
//     'line' =>
//     int(95)
//     'function' =>
//     string(6) "test_a"
//     'class' =>
//     string(1) "A"
//     'object' =>
//     class A#1 (0) {
//     }
//     'type' =>
//     string(2) "->"
//     'args' =>
//     array(0) {
//     }
//   }
// }

在类中使用的时候,在数组项中会多出一个 object 字段,显示的是这个方法所在类的信息。

debug_backtrace() 的函数声明是:

debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] ) : array

其中 options 是有两个常量可以定义,DEBUG_BACKTRACE_PROVIDE_OBJECT 表明是否填充 "object" 的索引;DEBUG_BACKTRACE_IGNORE_ARGS 是否忽略 "args" 的索引,包括所有的 function/method 的参数,能够节省内存开销。limits 可用于限制返回堆栈帧的数量,默认为0返回所有的堆栈。

debug_backtrace() 以及下面要介绍的 debug_print_backtrace() 方法都是支持 require/include 文件以及 eval() 中的代码的,在嵌入文件时,会输出嵌入文件的路径,这个大家可以自行尝试。

debug_print_backtrace()

这个方法从名称也可以看出,它会直接打印回溯内容,它的函数声明和 debug_backtrace() 是一样的,不过 $options 默认是 DEBUG_BACKTRACE_IGNORE_ARGS ,也就是说,它只打印调用所在文件及行数。

function a() {
    b();
}

function b() {
    c();
}

function c(){
    debug_print_backtrace();
}

a();

#0  c() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:144]
#1  b() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:140]
#2  a() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:151]

另外就是这个函数不需要使用 var_dump() 或 print_r() 进行输出,直接使用这个函数就会进行输出。能够非常快捷方便的让我们进行调试,比如在 laravel 这类大型框架中,我们在控制器需要查看堆栈信息时,就可以使用 debug_print_backtrace() 快速地查看当前的堆栈调用情况。而 debug_backtrace() 如果没有指定 $options 的话,则会占用非常大的内存容量或者无法完整显示。

总结

今天介绍的这两个函数能够灵活地帮助我们调试代码或者了解一个框架的调用情况。当然,在正式的情况下还是推荐使用 Xdebug 加上编辑器的支持来进行断点调试,因为使用 debug_backtrace() 这两个方法我们无法看到变量的变化情况。

测试代码:

github.com/zhangyue050…

以上就是PHP如何打印跟踪调试信息的详细内容,更多关于PHP打印调试信息的资料请关注我们其它相关文章!

(0)

相关推荐

  • 解决windows上php xdebug 无法调试的问题

    有时候我们在使用php和nginx进行开发的时候,会出现这样的情况,明明扩展已经安装,但是就是无法调试成功.这个时候我们就要耐心去分析问题产生的原因. 第一步:查看php的版本比如是否是x64还是x86,看看xdebug是否激活,可以通过phpinfo();来查看扩展是否激活. 第二步:使用php -m再次检查xdebug是否安装. 这个时候可能会遇到 xdebug must be loaded as zend extension .这个是因为我们在php.ini中配置extension的时候需

  • phpStudy vscode 搭建debug调试的教程详解

    下载地址 phpstudy:https://www.xp.cn/download.html vscode:https://code.visualstudio.com/ 设置 phpstudy版本:7.3.4nts [Xdebug] zend_extension=D:/phpstudy_pro/Extensions/php/php7.3.4nts/ext/php_xdebug.dll xdebug.collect_params=1 xdebug.collect_return=1 xdebug.au

  • PhpStorm 如何优雅的调试Hyperf的方法步骤

    前言: 我也是昨晚看了黄岛主的直播后学会的这个方法,今天中午趁着休息时间,把这个技巧分享给大家.就是大家在调试 Hyperf 的时候,可能总需要做一些服务的重启,重新点击 postman 的接口请求按钮,查看调试的结果是否正常,这篇文章就是教大家如何在 PhpStorm 中完成这一系列的操作. 一.Hyperf快速重启 第一步: 点击 PhpStorm 右上角的按钮,如图所示: 第二步: 点击弹框中左上角的添加按钮,然后再点击 PHP Script,如图所示: 第三步: 填写PHP脚本的信息:

  • Ubuntu下开启php调试模式报错信息解决办法

    Ubuntu下开启php调试模式报错信息解决办法 在Ubuntu下php的缺省设置是不显示错误信息的,如果程序出错会显示"无法处理此请求的错误提示",这在开发环境下非常不方便. 其实我们只要编辑下apache的配置文件就好 1.我的apache 配置文件目录是/etc/apache2/apache2.conf sudo vim /etc/apache2/apache2.conf 再最后加入以下两行 php_flag display_errors on php_value error_r

  • php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程

    时间:2020年8月15日10:25:47 Xdebug插件安装省略,自己百度安装,win和linux环境安装方式不一样. 注意和php版本匹配 1.phpinfo信息 2.php.ini配置 [xdebug] zend_extension=/usr/lib64/php/modules/xdebug.so xdebug.remote_enable =1 xdebug.profiler_enable = On xdebug.auto_trace=On xdebug.profiler_enable_

  • Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建

    1.Vagrant (LInux)环境下 Xdebug 配置 : zend_extension=xdebug.so xdebug.remote_enable = 1 xdebug.remote_connect_back = 1 xdebug.remote_port = 9100 xdebug.idekey = "PHPSTORM" xdebug.remote_autostart = 1 xdebug.remote_handler="dbgp" xdebug.remo

  • PHPStorm 2020.1 调试 Nodejs的多种方法详解

    捣鼓nodejs的调试时踩了一堆坑,看了看国内好多教程有点年分了,重新记录下 环境就是PHPSTORM2020.1 首先安装nodejs 然后在phpstorm中edit configuration 第一种方法: Node parameters 不要有任何东西,JS文件和工作目录填自己的 然后直接Debug: 需要有最后一句话 Debugger attached,并且调试器显示已经连接 第二种方法: Node parameters加上 --inspect 参数(或–debug 见下图),需要另外

  • PhpStorm+xdebug+postman调试技巧分享

    下面记录下我自己从安装到测试的全部详细过程.我的运行环境是:windows+wamp 一.配置wamp安装目录下的php.ini文件 我的安装目录是:C:\wamp64\bin\apache\apache2.4.23\bin 1 zend_extension ="c:/wamp64/bin/php/php5.6.31/zend_ext/php_xdebug-2.5.5-5.6-vc11-x86_64.dll" 2 xdebug.remote_enable = on 3 xdebug.p

  • 如何运行/调试你的PHP代码

    前言 没有任何一名程序员可以一气呵成.完美无缺的在不用调试的情况下完成一个功能或模块.调试实际分很多种情况.本篇文章我分享下自己在实际开发工作中的经验,我个人理解,调试分三种,注意我所讲的是调试并非测试 功能调试 组件调试 片段调试 功能调试是指在完成一个功能或者正在完成功能的过程中进行的错误.逻辑.结果的测试 组件调试是指将一个正在开发测试的插件.类进行错误.逻辑和结果的测试 片段调试是指将一段代码片段.函数.变量的预期和结果的测试 接下来我们看下本章列出的一些调试方法 暴力调试 这种方式简单

  • PHP如何打印跟踪调试信息

    目录 debug_backtrace() debug_print_backtrace() 总结 对于大部分编译型语言来说,比如 C . Java . C# ,我们都能很方便地进行断点调试,但是 PHP 则必须安装 XDebug 并且在编辑器中进行复杂的配置才能实现断点调试的能力.不过,如果只是简单的调试并且查看堆栈回溯的话,其实 PHP 已经为我们准备好了两个函数,能够让我们非常方便的看到程序运行时的调用情况. debug_backtrace() 从这个方法的字面意思上就可以看出,它的意思就是调

  • codeigniter发送邮件并打印调试信息的方法

    本文实例讲述了codeigniter发送邮件并打印调试信息的方法.分享给大家供大家参考.具体如下: 这里的codeigniter代码实现发送邮件并打印调试信息的功能,用codeigniter自带的邮件发送库发送邮件 $this->load->library('email' ); $this->email- >from(' you@example. com' , ' Your Name' ); $this->email- >to('someone@example. com

  • SpringBoot通过redisTemplate调用lua脚本并打印调试信息到redis log(方法步骤详解)

    第一次写Lua脚本,并通过springboot的redisTemplate调用脚本,进行脚本与应用的交互.不熟悉真的折腾了好久,现在总结一下学习过程: 第一次写完lua时,想到的就是如何在应用调用脚本的时候,去调试脚本.在网上海搜了一把,能找到的有点相关的寥寥无几. 有一种方法是通过执行redis命令,调用redis客户端,加载lua脚本,然后出现基于命令行调试的交互界面,输入调试命令去调试脚本.如下: 在终端输入命令:redis-cli.exe --ldb --eval LimitLoadTi

  • PHP使用debug_backtrace方法跟踪调试代码调用详解

    本文实例讲述了PHP使用debug_backtrace方法跟踪调试代码调用.分享给大家供大家参考,具体如下: 在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到出问题的地方进行修改.如果有一个方法可以获取到某段代码是被哪个方法调用,并能一直回溯到最开始调用的地方(包括调用的文件,行数,参数等),这样就能很方便的定位到出问题的地方. 使用php的debug_backtrace方法可以对代码调用进行跟踪,方便调试代码.它可以生成一个关联数组,数组中会收集当前应

  • django日志默认打印request请求信息的方法示例

    需求 请求view中手动打印日志时中插入request的如下信息(每个request请求都记录可以使用中间件进行解决,但这里仅仅是在需要的地方手动打印): #统一附加日志内容 ADD_LOG = r'''{"username": request.user, "path": request.path, "request_id": request.id, "login_id": request.login_id}''' 旧的解决办

  • vue-cli3自动消除console.log()的调试信息方式

    在vue-cli3里面已经有这个功能了,只需要开启这个功能就行了,默认是关闭的 1.找到生产环境的配置文件 2.然后找到 UglifyJsPlugin 这个插件添加一行代码 补充知识:Vue cli3 实现去除console.log 去除控制台输出 下载移除控制台输出的包 npm install babel-plugin-transform-remove-console --save-dev 新建 babel.config.js let plugins = [ vant插件的按需加载 [ 'im

  • 解决jmap命令打印JVM堆信息异常的问题

    jmap命令可以打印java进程的JVM堆信息,今天在某台机器上运行该命令查看 19560进程的堆信息 jmap -heap 19560 出现以下异常 Attaching to process ID 19560, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.79-b02 using thread-local object allocation. Paralle

  • C语言结合ffmpeg打印音视频信息

    目录 一.通过此文可以得到什么 二.实现思路 三.实现效果 四.实现源代码  一.通过此文可以得到什么 通过此练习: 1.知道了如何计算一个音频和视频的播放时间: 2.知道了音视频解码的思路的大体流程,之后无非就是在这个流程上进行扩充细节: 3.知道了如何通过C语言或者C++编程语言结合ffmpeg拿到一些音视频的关键信息,例如:帧率等: 二.实现思路 三.实现效果 zhenghui@zh-pc:/data/project/VSCProject/ffmpegStudy$ make make al

  • Node.js利用debug模块打印出调试日志的方法

    前言 大家都知道在node程序开发中时,经常需要打印调试日志.用的比较多的是debug模块,比如express框架中就用到了.下文简单举几个例子进行说明.文中相关代码示例,可在这里找到. 备注:node在0.11.3版本也加入了util.debuglog()用于打印调试日志,使用方法跟debug模块大同小异. 基础例子 首先,安装debug模块. npm install debug 使用很简单,运行node程序时,加上DEBUG=app环境变量即可. /** * debug基础例子 */ var

  • Java如何自定义异常打印非堆栈信息详解

    前言 在学习Java的过程中,想必大家都一定学习过异常这个篇章,异常的基本特性和使用这里就不再多讲了.什么是异常?我不知道大家都是怎么去理解的,我的理解很简单,那就是不正常的情况,比如我现在是个男的,但是我却有着女人所独有的东西,在我看来这尼玛肯定是种异常,简直不能忍.想必大家都能够理解看懂,并正确使用. 但是,光学会基本异常处理和使用不够的,在工作中出现异常并不可怕,有时候是需要使用异常来驱动业务的处理,例如: 在使用唯一约束的数据库的时候,如果插入一条重复的数据,那么可以通过捕获唯一约束异常

随机推荐