php 利用debug_backtrace方法跟踪代码调用
在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到出问题的地方进行修改。如果有一个方法可以获取到某段代码是被哪个方法调用,并能一直回溯到最开始调用的地方(包括调用的文件,行数,参数等),这样就能很方便的定位到出问题的地方。
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方法跟踪代码调用的更多相关文章
- 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 ...
- iOS JS 交互之利用系统JSContext实现 JS调用OC方法以及Objective-C调用JavaScript方法
ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择拷贝到工程中,(拖入的文件夹是蓝色 ...
- ReactNative-JS 调用原生方法实例代码(转载)
第一步首先创建ReactNative 模块类继承ReactContextBaseJavaModule package com.mixture; import android.content.Con ...
随机推荐
- LOJ#508. 「LibreOJ NOI Round #1」失控的未来交通工具
题意 一个带边权无向图,有两种操作:加边以及询问在\(x,x+b,...,x+(c-1)b\)这些数中,有多少个数存在至少一条与之模\(m\)同余的从\(u\)到\(v\)的路径(可以不是简单路径). ...
- easyui datagrid设置排序
sortable="true" order="desc" 或者 sortable:true,order:'desc'
- PHP Files functions
simple functions <?php $docRoot = $_SERVER['DOCUMENT_ROOT']; //readfile($docRoot."/orders/or ...
- C# GZip Compress DeCompress
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- The sklearn preprocessing
Recently, I was writing module of feature engineering, i found two excellently packages -- tsfresh a ...
- java - CAS及CAS底层原理
CAS是什么? CAS的全称为Compare-And-Swap它是一条CPU并发原语,也就是在CPU硬件层面上来说比较并且判断是否设置新值这段操作是原子性的,不会被其他线程所打断.在JAVA并发包ja ...
- [Python]python去除两个txt文件的重复词汇 python 2020.2.10
两个txt文件词汇,用换行符分隔.可以用代码将要处理的文件去掉另一个文件所包含的重复内容. 如: a.txt内容为: 衡山 泰山 西湖 紫禁城 b.txt内容为: 泰山 衡山 长白山 张三丰 将a.t ...
- java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现
注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...
- SSM项目集成Lucene+IKAnalyzer在Junit单元测试中执行异常
个人博客 地址:http://www.wenhaofan.com/article/20181108132519 问题描述 在项目运行以及main方法中能够正常运行,但是使用junit单元测试时却报如下 ...
- 【做题笔记】洛谷P1506 拯救oibh总部
跑一遍染色法,最后判断哪些位置没被染色即可 一些技巧: 为了判断方便,把字符转换成 int 型的数字. 注意边界问题 详细解释见代码 #include <iostream> #includ ...