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

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

debug_backtrace 方法说明
产生一条回溯跟踪(backtrace)

array debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] )
1
  
参数

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   如果在一个函数里,这会列出函数的参数。 如果是在一个被包含的文件里,会列出包含的文件名。
1
2
3
4
5
6
7
8

实例
获取订单的用户资料及用户讯息,调用流程是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);
?>
1
2
3
4
5
6
7
8
9
  
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;

}

}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  
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;

}

}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  
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;

}

}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
运行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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
可以看到调用过程是

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
————————————————
版权声明:本文为CSDN博主「傲雪星枫」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fdipzone/article/details/78637990

php 利用debug_backtrace方法跟踪代码调用相关推荐

  1. php执行跟踪_PHP使用debug_backtrace方法跟踪调试代码调用详解

    本文实例讲述了PHP使用debug_backtrace方法跟踪调试代码调用.分享给大家供大家参考,具体如下: 在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到 ...

  2. php如何跟踪调试,PHP使用debug_backtrace方法跟踪调试代码调用详解

    本文实例讲述了PHP使用debug_backtrace方法跟踪调试代码调用.分享给大家供大家参考,具体如下: 在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到 ...

  3. Java05-day05【方法(概述、调用过程图解)、带参方法、带返回值方法、重载、方法参数传递(基本类型、引用类型)】

    java零基础入门到精通(2019版)[黑马程序员] 视频+资料:[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] &qu ...

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

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

  5. php引用公有类方法_PHP 利用反射(ReflectionClass)调用其他类的方法 | 剑花烟雨江南...

    在相对复杂的项目中,我们可以利用分层来降低代码的耦合,并封装一些公用的方法,加快我们的开发速度.因此,在实际开发中,可以将代码分为: 控制器层.服务层.逻辑层.模型层等等.... 服务层: 所谓的服务 ...

  6. ckEditor使用JS代码调用的方法

    <script type="text/javascript" src="http://www.cnblogs.com/ckeditor/ckeditor.js&qu ...

  7. 如何使用沃顿研究数据中心(WRDS,CRSP)查询美股历史交易数据(R语言的调用方法以及代码示例)

    https://wrds-web.wharton.upenn.edu/wrds/ WRDS 沃顿商学院金融系列数据库是由宾夕法尼亚大学沃顿商学院开发的金融领域的跨库研究工具,同时也包含Compusta ...

  8. strace,ltrace linux下跟踪进程调用的命令

     本工具可以用来做大多数排除,比如mount一个NFS,很慢,找不出原因,我们可以使用strace命令来跟中mount这个经常所有的调用过程. strace 命令是一种强大的工具,它能够显示所有由 ...

  9. 检测Android模拟器的方法和代码实现

    专自:https://bbs.pediy.com/thread-225717.htm 刚刚看了一些关于Detect Android Emulator的开源项目/文章/论文, 我看的这些其实都是13年1 ...

最新文章

  1. 完美运动框架(js)
  2. MySQL删除数据语句
  3. Android中读取NFC标签卡中的ID
  4. N-Gram的基本原理
  5. 前端学习(2641):懂代码之header表头页之控制全屏显示
  6. 牛客16732 序列(排列组合)
  7. 常用SQL语句(增删查改、合并统计、模糊搜索)
  8. java在线支付---02_分析易宝支付的工作流程
  9. 自己定义了个一类似UISegment的东西
  10. Android Studio导入安卓源码
  11. cisco思科模拟器交换机和路由器基础命令
  12. 极速办公(PPT)如何添加双删除线
  13. oracle分类账设置,Oracle EBS R12 总账与子分类账的关系
  14. 视频重建论文EDVR: Video Restoration with Enhanced Deformable Convolutional Networks阅读笔记
  15. 杨辉三角c语言杭电,杭电 杨辉三角
  16. qt实现调用电脑摄像头
  17. java从入门到精通pdf下载,太香了
  18. 深度学习环境配置超详细教程【Anaconda+PyTorch(GPU版)+CUDA+cuDNN】
  19. c语言期末系统答辩,C语言期末项目答辩实施方案.doc-资源下载人人文库网
  20. Go开源游戏服务器框架——Pitaya

热门文章

  1. 上大专是学计算机还是会计,上三本还是上专科 大专学什么专业好
  2. html fmt转换日期格式,js通用时间格式转换函数
  3. 鸿蒙系统是单任务还是多任务,在鸿蒙系统上使用MQTT编程
  4. Mongodb 集群加keyFile认证,Mongodb用户管理(转:http://blog.csdn.net/wlzjsj/article/details/61421230)
  5. 6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化
  6. 使用EasyUI Tree异步加载JSON数据 生成树
  7. MULE ESB学习笔记
  8. SimpleDateFormat 按照不同要求去改写时间的格式,或者把时间串变成date类型
  9. 图像锐化算法(Image sharpening):拉普拉斯增强和Unsharp Masking(附代码)
  10. pytorch中的pre-train函数模型引用及修改(增减网络层,修改某层参数等)