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 ...
随机推荐
- 安装Ansible到CentOS(YUM)
运行环境 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:ansible 硬件要求:无 安装过程 1.安装YUM-EPEL源 HTTP-Tools软件包由 ...
- STM32CubeMX自建MDK工程的基本步骤
根据需要调节各总线频率 最下方选项,√去掉,不用实时更新库,选择自己库所在路径就好. 点击左侧, 选择"Code Generator", 选择.c 和 .h文件不分开 最后,点击& ...
- 【PHP】使用PHP抓取Bing每日图像并为己所用
Bing搜索的首页每天都会推送一张很漂亮的图片,把它保存下来,当做电脑桌面或是自己的网站背景图还不是美滋滋…… 今天的bing图片是这样的 既然要抓取这张图片,首先就得弄清这张图是从何而来的.经过对必 ...
- ISCC2018 Reverse & Pwn writeup
Reference:L1B0 Re RSA256 春秋欢乐赛原题..flag都不变的 给了三个加密文件和公钥证书public.key,可以使用openssl进行处理 $openssl rsa -pub ...
- JS 字符串 String对象
charAt(index) 返回指定索引位置的字符 charCodeAt() 返回指定索引位置字符的 Unicode 值 indexOf(searchString, startIndex) 返回子字符 ...
- 微信小程序之数组操作:push与concat的区别
微信小程序中需要用到数组的操作,push和concat二者功能很相像,但有两点区别. 先看如下例子: var arr = []; arr.push(); arr.push(); arr.push([, ...
- 杭电oj2037——今年暑假不AC(java实现)
思路:标准贪心 先把所有思路列出来: 1.优先选择开始时间最早的,经分析,不可行 2.优先选择持续时间最短的,经分析,不可行 3.优先选择结束时间最早的,经分析,可行 然后根据第三种思路实现代码就好 ...
- 162.扩展User模型-使用Proxy模型
扩展用户模型: Django内置的User模型虽然已经足够强大了,但是有时候还是不能满足我们的需求,比如在验证用户登录的时候,它用的是用户名作为验证,而我们有时候需要通过手机号码或者是邮箱进行验证,还 ...
- android 获取所有SD卡目录
//返回sd卡路径public static List<String> getStorageDirectories(Context context) { StorageManager sm ...
- 3ds Max File Format (Part 6: We get signal)
Let's see what we can do now. INode *node = scene.container()->scene()->rootNode()->find(uc ...