广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP如何打印跟踪调试信息
  • 691
分享到

PHP如何打印跟踪调试信息

2024-04-02 19:04:59 691人浏览 八月长安
摘要

目录debug_backtrace()debug_print_backtrace()总结对于大部分编译型语言来说,比如 C 、 Java 、 C# ,我们都能很方便地进行断点调试,但

对于大部分编译型语言来说,比如 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打印调试信息的资料请关注编程网其它相关文章!

--结束END--

本文标题: PHP如何打印跟踪调试信息

本文链接: https://www.lsjlt.com/news/124665.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP如何打印跟踪调试信息
    目录debug_backtrace()debug_print_backtrace()总结对于大部分编译型语言来说,比如 C 、 Java 、 C# ,我们都能很方便地进行断点调试,但...
    99+
    2022-11-12
  • PHP中怎么实现打印跟踪调试信息
    本篇文章给大家分享的是有关PHP中怎么实现打印跟踪调试信息,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。PHP打印跟踪调试信息对于大部分编译型语言来说,比如 C 、 Java ...
    99+
    2023-06-15
  • Android.mk文件添加调试打印信息
          Android.mk文件添加调试打印信息 前言    你是否有过这么一个需求,就是Android的编译环境是由无数个Andro...
    99+
    2022-06-06
    调试 Android
  • php如何打印报错信息
    这篇文章主要介绍php如何打印报错信息,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php打印报错信息的方法:1、修改php.ini内容如“display_startup_errors = On”;2、在需要调试的p...
    99+
    2023-06-22
  • mfc中如何输出打印信息
    在MFC中,可以使用`TRACE`宏、`AfxMessageBox`函数和`OutputDebugString`函数来输出打印信息。...
    99+
    2023-10-28
    mfc
  • python中如何打印日志信息
    日志打印方式 常见的Python日志打印方式为使用内置函数print()或者logging模块打印日志。 print()只能将日志打印至控制台,不推荐此方式logging模块默认将日志打印至控制台,也...
    99+
    2023-09-05
    python
  • shell如何打印一些头信息
    这篇文章主要介绍了shell如何打印一些头信息,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。打印一些头信息command  <<  dilim...
    99+
    2023-06-27
  • 调试JavaScript代码如何打印调用堆栈
    小编给大家分享一下调试JavaScript代码如何打印调用堆栈,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!打印调用堆栈可以通过调试面板查看当前代码的调用堆栈,也...
    99+
    2023-06-27
  • Android中jni如何调试打印char阵列
    这篇文章将为大家详细讲解有关Android中jni如何调试打印char阵列,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Android jni调试打印char阵列的实例详解前言:在android开发中,用...
    99+
    2023-05-30
    android jni
  • SpringBoot 如何自定义项目启动信息打印
    目录1. 修改 Banner1.1. 字符 Banner1.2. 图片 Banner1.3. Banner 配置2. 添加访问地址自定义springboot启动图案输出直接上内容1....
    99+
    2022-11-12
  • C语言结合ffmpeg如何打印音视频信息
    今天就跟大家聊聊有关C语言结合ffmpeg如何打印音视频信息,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、通过此文可以得到什么通过此练习:知道了如何计算一个音频和视频的播放时间;...
    99+
    2023-06-22
  • python如何使用print打印带有颜色的信息
    这篇文章主要介绍python如何使用print打印带有颜色的信息,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!print 打印带有颜色的信息大家知道 Python 中的信息打印函数 ...
    99+
    2022-10-19
  • 如何使用PHP开发微信小程序的任务跟踪功能?
    如何使用PHP开发微信小程序的任务跟踪功能?随着微信小程序的普及和使用,越来越多的开发者开始将其应用于各种场景。其中,任务跟踪功能是许多应用场景中常见的需求之一。本文将介绍如何使用PHP开发微信小程序的任务跟踪功能,并提供具体的代码示例。在...
    99+
    2023-10-27
    微信小程序 PHP开发 任务跟踪功能
  • 微信小程序API如何打开调试
    这篇“微信小程序API如何打开调试”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“微信小程序API如何打开调试”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让我们进入...
    99+
    2023-06-26
  • 调试JavaScript代码如何以表格的方式打印对象
    这篇文章主要介绍调试JavaScript代码如何以表格的方式打印对象,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!以表格的方式打印对象下面是一个对象,可以通过 console.table( obj ) 来打印这个对象...
    99+
    2023-06-27
  • 如何使用golang中的net/http/httputil.DumpRequest函数打印HTTP请求信息
    如何使用golang中的net/http/httputil.DumpRequest函数打印HTTP请求信息概述:在Golang中,可以使用net/http包提供的httputil.DumpRequest函数来打印HTTP请求信息。这个函数可...
    99+
    2023-11-18
    net/http 关键词:Golang httputilDumpRequest
  • 如何使用golang中的net/http/httputil.DumpResponse函数打印HTTP响应信息
    如何使用golang中的net/http/httputil.DumpResponse函数打印HTTP响应信息在golang中,我们可以使用net/http包来发送HTTP请求并接收HTTP响应。有时候,我们需要查看HTTP响应的详细信息,例...
    99+
    2023-11-18
    Golang net/http httputilDumpResponse
  • C#中如何使用日志记录和调试信息输出
    C#中如何使用日志记录和调试信息输出引言:在软件开发过程中,日志记录和调试信息输出是非常重要的工具。通过合理的日志记录和调试信息输出,我们可以更好地了解程序运行的状态,进而解决问题并改进程序的性能。本文将介绍在C#中如何使用日志记录和调试信...
    99+
    2023-10-22
    输出 (Output) 日志记录 (Log) 调试信息 (Debug)
  • Java多线程调试中如何完成信息输出处理
    Java多线程调试中如何完成信息输出处理,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java多线程调试是很繁琐的,但是还是需要我们不断进行相关的学习。下面我们就来看看在J...
    99+
    2023-06-17
  • 如何利用vbs脚本实现设置IE的打印页眉页脚信息
    本篇内容主要讲解“如何利用vbs脚本实现设置IE的打印页眉页脚信息”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用vbs脚本实现设置IE的打印页眉页脚信息”吧!将下面的内容保存成.vbs文...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作