PHP使用debug_backtrace方法跟踪代码调用
在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到出问题的地方进行修改。如果有一个方法可以获取到某段代码是被哪个方法调用,并能一直回溯到最开始调用的地方(包括调用的文件,行数,参数等),这样就能很方便的定位到出问题的地方。
php的debug_backtrace方法可以对代码调用进行跟踪,方便调试代码。
debug_backtrace 方法说明
产生一条回溯跟踪(backtrace)
array debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] )
参数
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 = 1000000; $oOrder = new Order;
$order_info = $oOrder->get_order($order_id);
?>
order.php
<?php
require 'user.php'; // 订单资料
class Order{ // 获取订单资料
function get_order($order_id){ $user_id = 1001; // 获取用户资料
$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; } }
?>
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; } }
?>
message.php
<?php
// 用户讯息
class Message{ // 获取用户讯息
function get_message($user_id){ $message = array(
array('id'=>1, 'title'=>'message1'),
array('id'=>2, 'title'=>'message2'),
); // 加入跟踪调试
$backtrace = debug_backtrace();
var_dump($backtrace); return $message; } }
?>
运行index.php, 输出
/message.php:15:
array (size=3)
0 =>
array (size=7)
'file' => string '/user.php' (length=9)
'line' => int 12
'function' => string 'get_message' (length=11)
'class' => string 'Message' (length=7)
'object' =>
object(Message)[3]
'type' => string '->' (length=2)
'args' =>
array (size=1)
0 => int 1001
1 =>
array (size=7)
'file' => string '/order.php' (length=10)
'line' => int 14
'function' => string 'get_user' (length=8)
'class' => string 'User' (length=4)
'object' =>
object(User)[2]
'type' => string '->' (length=2)
'args' =>
array (size=1)
0 => int 1001
2 =>
array (size=7)
'file' => string '/index.php' (length=9)
'line' => int 8
'function' => string 'get_order' (length=9)
'class' => string 'Order' (length=5)
'object' =>
object(Order)[1]
'type' => string '->' (length=2)
'args' =>
array (size=1)
0 => int 1000000
可以看到调用过程是
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方法跟踪代码调用的更多相关文章
- php debug_backtrace方法跟踪代码调用
php debug_backtrace方法跟踪代码调用<pre>function string 当前的函数名,参见: __FUNCTION__.line integer 当前的行号.参见: ...
- php 利用debug_backtrace方法跟踪代码调用
在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到出问题的地方进行修改.如果有一个方法可以获取到某段代码是被哪个方法调用,并能一直回溯到最开始调用的地方(包括调 ...
- php的内置函数debug_backtrace()与get_included_files()跟踪代码调用(Thinkphp框架举例)
debug_backtrace() 在我们开发一个项目中,或者二开研究某个开源程序,需要对代码流程一步步去跟踪,来研究它的逻辑,才可以进行修改,达到我们的开发目的.php的内置函数debug_back ...
- Android调用JNI本地方法跟踪目标代码
正如Android调用JNI本地方法经过有点改变章所说跟踪代码是可行的,但是跟踪某些代码会出现anr,点击取消,还是不好运,有提高办法吗?回答是有(gdb还没试过,本文只讨论ida). 下面是我使用 ...
- eclipse查看方法被那些代码调用open call hierarchy
当我们编写的代码量十分巨大,项目十分复杂的时候,想要查找某一个方法都被其他那些代码调用了是一件十分困难的事,然后Eclipse提供了十分方便的方法用于查看方法都被那些代码调用了. 方法一: 选中要查看 ...
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. 不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...
- jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行?
jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行? 因为在解析时最新解析的就是JA ...
- ReactNative-JS 调用原生方法实例代码(转载)
第一步首先创建ReactNative 模块类继承ReactContextBaseJavaModule package com.mixture; import android.content.Con ...
- Dottrace跟踪代码执行时间
当自己程序遇到性能问题,比如请求反应缓慢,怎么分析是哪里出了问题呢?dottrace可以帮助.net程序跟踪出代码里每个方法的执行时间,这样让我们更清晰的看出是哪里执行时间过长,然后再分析应该怎样解决 ...
随机推荐
- 【模板】插头dp
题目描述 题解: 插头$dp$中经典的回路问题. 首先了解一下插头. 一个格子,上下左右四条边对应四个插头.就像这样: 四个插头. 一个完整的哈密顿回路,经过的格子一定用且仅用了两个插头. 所以所有被 ...
- 7. 配置undo表空间
7. 配置undo表空间 undo日志可以存储在一个或多个undo表空间中,无需存储在系统表空间中. 要为MySQL实例配置单独的undo表空间,请执行以下步骤 [重要]: 只能在初始化新MySQL实 ...
- BERT模型介绍
前不久,谷歌AI团队新发布的BERT模型,在NLP业内引起巨大反响,认为是NLP领域里程碑式的进步.BERT模型在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越 ...
- python基础知识07-函数作用域和匿名函数
1.匿名函数 list(filter(lamda a:a>3,[1,2,3,4,5])) 一般和过滤器一起使用 2.函数的作用域 a = 123 def test(): a = 666 a = ...
- python直接赋值、深浅拷贝实例剖析
根据数据类型分为两部分进行剖析: int.str类型 list.tuple.dict类型等 1. int.str类型 [int类型实例] >>> import copy ...
- 2. TypeScript笔记
1. 安装node.js之后 需要测试npm命令 2.命令正常安装TypeScript 3.安装Egret egret 命令
- .NET Core使用log4Net记录日志
1.引入Nuget包 log4net 2.添加log4Net配置文件 <?xml version="1.0" encoding="utf-8" ?> ...
- MySQL报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents
参考资料:https://blog.csdn.net/qq_37630354/article/details/82814330 在property里加上最后这个参数即可
- ExtJs 滚动条问题
bodyStyle :'overflow-x:visible;overflow-y:scroll', //隐藏水平滚动条 通过这个方法可以显示或隐藏滚动条 var form = new Ext.for ...
- 洛谷P1244 青蛙过河
P1244 青蛙过河 362通过 525提交 题目提供者该用户不存在 标签 难度普及- 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 题目什么意思 题目看不懂啊 题目描述 有一条河 ...