在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到出问题的地方进行修改。如果有一个方法可以获取到某段代码是被哪个方法调用,并能一直回溯到最开始调用的地方(包括调用的文件,行数,参数等),这样就能很方便的定位到出问题的地方。

php的debug_backtrace方法可以对代码调用进行跟踪,方便调试代码。

debug_backtrace 方法说明

产生一条回溯跟踪(backtrace)

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

参数
options

DEBUG_BACKTRACE_PROVIDE_OBJECT 是否填充 “object” 的索引。
DEBUG_BACKTRACE_IGNORE_ARGS 是否忽略 “args” 的索引,包括所有的 function/method 的参数,能够节省内存开销。

limit
这个参数能够用于限制返回堆栈帧的数量,默认为(limit=0),返回所有堆栈帧。

返回值
返回一个包含众多关联数组的array,可能返回的元素:

名字         类型    说明
function string 当前的函数名,参见: __FUNCTION__。
line integer 当前的行号。参见: __LINE__。
file string 当前的文件名。参见: __FILE__。
class string 当前 class 的名称。参见 __CLASS__
object object 当前的 object。
type string 当前调用的类型。如果是一个方法,会返回 "->"。如果是一个静态方法,会返回 "::"。 如果是一个函数调用,则返回空。
args array 如果在一个函数里,这会列出函数的参数。 如果是在一个被包含的文件里,会列出包含的文件名。

实例

获取订单的用户资料及用户讯息,调用流程是 index->order->user->message,最后返回整理后的信息。

假设我们调试时发现message的数据有误,则可以在message使用debug_backtrace方法,查看调用的流程及调用的参数,检查哪一步出现问题。

使用DEBUG_BACKTRACE_IGNORE_ARGS则会忽略args(方法调用的参数)

index.php

 <?php
require 'order.php'; // 获取用户订单资料
$order_id = ; $oOrder = new Order;
$order_info = $oOrder->get_order($order_id);
?>

index.php

order.php

 <?php
require 'user.php'; // 订单资料
class Order{ // 获取订单资料
function get_order($order_id){ $user_id = ; // 获取用户资料
$oUser = new User;
$user_info = $oUser->get_user($user_id); // 订单资料
$order_info = array(
'order_id' => $order_id,
'order_name' => 'my order',
'user_info' => $user_info,
); return $order_info; } }
?>

order.php

user.php

 <?php
require 'message.php'; // 用户资料
class User{ // 获取用户资料
function get_user($user_id){ // 获取用户讯息
$oMessage = new Message;
$user_message = $oMessage->get_message($user_id); $user_info = array(
'user_id' => $user_id,
'name' => 'fdipzone',
'message' => $user_message
); return $user_info; } }
?>

user.php

message.php

 <?php
// 用户讯息
class Message{ // 获取用户讯息
function get_message($user_id){ $message = array(
array('id'=>, 'title'=>'message1'),
array('id'=>, 'title'=>'message2'),
); // 加入跟踪调试
$backtrace = debug_backtrace();
var_dump($backtrace); return $message; } }
?>

message.php

运行index.php, 输出

/message.php::
array (size=)
=>
array (size=)
'file' => string '/user.php' (length=)
'line' => int
'function' => string 'get_message' (length=)
'class' => string 'Message' (length=)
'object' =>
object(Message)[]
'type' => string '->' (length=)
'args' =>
array (size=)
=> int
=>
array (size=)
'file' => string '/order.php' (length=)
'line' => int
'function' => string 'get_user' (length=)
'class' => string 'User' (length=)
'object' =>
object(User)[]
'type' => string '->' (length=)
'args' =>
array (size=)
=> int
=>
array (size=)
'file' => string '/index.php' (length=)
'line' => int
'function' => string 'get_order' (length=)
'class' => string 'Order' (length=)
'object' =>
object(Order)[]
'type' => string '->' (length=)
'args' =>
array (size=)
=> int

可以看到调用过程是

1.index.php
line 8
class Order
function get_order
args int 1000000

2.order.php
line 14
class User
function get_user
args int 1001

3.user.php
line 12
class Message
function get_message
args int 1001

感谢博主,原文地址

php 利用debug_backtrace方法跟踪代码调用的更多相关文章

  1. php debug_backtrace方法跟踪代码调用

    php debug_backtrace方法跟踪代码调用<pre>function string 当前的函数名,参见: __FUNCTION__.line integer 当前的行号.参见: ...

  2. PHP使用debug_backtrace方法跟踪代码调用

    在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到出问题的地方进行修改.如果有一个方法可以获取到某段代码是被哪个方法调用,并能一直回溯到最开始调用的地方(包括调 ...

  3. php的内置函数debug_backtrace()与get_included_files()跟踪代码调用(Thinkphp框架举例)

    debug_backtrace() 在我们开发一个项目中,或者二开研究某个开源程序,需要对代码流程一步步去跟踪,来研究它的逻辑,才可以进行修改,达到我们的开发目的.php的内置函数debug_back ...

  4. Android调用JNI本地方法跟踪目标代码

    正如Android调用JNI本地方法经过有点改变章所说跟踪代码是可行的,但是跟踪某些代码会出现anr,点击取消,还是不好运,有提高办法吗?回答是有(gdb还没试过,本文只讨论ida). 下面是我使用  ...

  5. eclipse查看方法被那些代码调用open call hierarchy

    当我们编写的代码量十分巨大,项目十分复杂的时候,想要查找某一个方法都被其他那些代码调用了是一件十分困难的事,然后Eclipse提供了十分方便的方法用于查看方法都被那些代码调用了. 方法一: 选中要查看 ...

  6. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

  7. jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行?

    jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行? 因为在解析时最新解析的就是JA ...

  8. iOS JS 交互之利用系统JSContext实现 JS调用OC方法以及Objective-C调用JavaScript方法

    ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择拷贝到工程中,(拖入的文件夹是蓝色 ...

  9. ReactNative-JS 调用原生方法实例代码(转载)

    第一步首先创建ReactNative 模块类继承ReactContextBaseJavaModule package com.mixture;   import android.content.Con ...

随机推荐

  1. Android Studio 安装问题。

    安装时,这里要选Cancel 安装AS时因为选择了Setup Proxy, 后面带来很多问题. --------------------------------------------- 参考这个安装 ...

  2. Docker 使用记录

    1.Docker 镜像加载本地镜像 2.Docker 创建镜像: 创建dockerfile 文件: 进入到文件目录下: 输入命令 docker build -t xxxx . 注意:后面的小点要有, ...

  3. 小白的java学习之路 “ 带参数的方法”

    一.带参数的方法: 1.1 语法: <访问修饰符> 返回类型 <方法名>(<形式参数列表>) { //方法的主体 } 1.2 案例: 榨汁机 public clas ...

  4. 微信小程序 --- 日历效果

    wxml部分: <view class='box1' style='width: {{ sysW * 7 }}px'> <view class='dateBox'>{{ yea ...

  5. 专项:Vuejs面试题集合

    参考网络资源:https://segmentfault.com/a/1190000012315822 1.active-class是哪个组件的属性? 答:active-class是vue-router ...

  6. Windows中配置maven环境变量

    添加maven环境变量 添加新的系统环境变量:MAVEN_HOME 设置其值为你安装的目录:D:\IT_program\apache-maven-3.6.0 更新系统PATH 变量 添加变量值:%MA ...

  7. Unable to create initial connections of pool. spring boot mysql

    Unable to create initial connections of pool. 在链接url里添加 将useSSL=true改为useSSL=false 只能说明服务器没有打开SSL功能

  8. Selenium3+python自动化010-UnitTest框架简介和单元测试框架使用

    一.UnitTest介绍 unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过, ...

  9. Java后端知识体系及路线【最新秘籍】

    第一层(基本语法)   第一层心法,主要都是基本语法,程序设计入门,悟性高者十天半月可成,差一点的 3 到 6 个月也说不准.如果有其他开发语言的功底相助,并且有张无忌的悟性与运气,相信第一层只在片刻 ...

  10. RN开发-JSX基础语法

    1.环境        react.js        react-dom.js        browser.min.js(解码器)        2.载入方式        内联.外联       ...