首頁  >  文章  >  後端開發  >  如何透過php 實作debug_backtrace方法追蹤程式碼調用

如何透過php 實作debug_backtrace方法追蹤程式碼調用

jacklove
jacklove原創
2018-06-08 15:54:171478瀏覽

在開發過程中,例如要修改別人開發的程式碼或調試出問題的程式碼,需要對程式碼流程一步步去跟踪,找到出問題的地方進行修改。如果有一個方法可以取得到某段程式碼是被哪個方法調用,並且能一直回溯到最開始調用的地方(包括調用的文件,行數,參數等),這樣就能很方便的定位到出問題的地方。

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

#
<?phprequire &#39;order.php&#39;;// 获取用户订单资料$order_id = 1000000;$oOrder = new Order;$order_info = $oOrder->get_order($order_id);?>

order.php

<?phprequire &#39;user.php&#39;;// 订单资料class Order{

    // 获取订单资料
    function get_order($order_id){

        $user_id = 1001;        // 获取用户资料
        $oUser = new User;        $user_info = $oUser->get_user($user_id);        // 订单资料
        $order_info = array(            &#39;order_id&#39; => $order_id,            &#39;order_name&#39; => &#39;my order&#39;,            &#39;user_info&#39; => $user_info,
        );        return $order_info;

    }

}?>

#user.php

<?phprequire &#39;message.php&#39;;// 用户资料class User{

    // 获取用户资料
    function get_user($user_id){

        // 获取用户讯息
        $oMessage = new Message;        $user_message = $oMessage->get_message($user_id);        $user_info = array(                &#39;user_id&#39; => $user_id,                &#39;name&#39; => &#39;fdipzone&#39;,                &#39;message&#39; => $user_message
        );        return $user_info;

    }

}?>

 
message.php

<?php// 用户讯息class Message{

    // 获取用户讯息
    function get_message($user_id){

        $message = array(            array(&#39;id&#39;=>1, &#39;title&#39;=>&#39;message1&#39;),            array(&#39;id&#39;=>2, &#39;title&#39;=>&#39;message2&#39;),
        );        // 加入跟踪调试
        $backtrace = debug_backtrace();
        var_dump($backtrace);        return $message;

    }

}?>

運行index.php, 輸出

/message.php:15:array (size=3)  0 => 
    array (size=7)      &#39;file&#39; => string &#39;/user.php&#39; (length=9)      &#39;line&#39; => int 12
      &#39;function&#39; => string &#39;get_message&#39; (length=11)      &#39;class&#39; => string &#39;Message&#39; (length=7)      &#39;object&#39; => 
        object(Message)[3]      &#39;type&#39; => string &#39;->&#39; (length=2)      &#39;args&#39; => 
        array (size=1)          0 => int 1001
  1 => 
    array (size=7)      &#39;file&#39; => string &#39;/order.php&#39; (length=10)      &#39;line&#39; => int 14
      &#39;function&#39; => string &#39;get_user&#39; (length=8)      &#39;class&#39; => string &#39;User&#39; (length=4)      &#39;object&#39; => 
        object(User)[2]      &#39;type&#39; => string &#39;->&#39; (length=2)      &#39;args&#39; => 
        array (size=1)          0 => int 1001
  2 => 
    array (size=7)      &#39;file&#39; => string &#39;/index.php&#39; (length=9)      &#39;line&#39; => int 8
      &#39;function&#39; => string &#39;get_order&#39; (length=9)      &#39;class&#39; => string &#39;Order&#39; (length=5)      &#39;object&#39; => 
        object(Order)[1]      &#39;type&#39; => string &#39;->&#39; (length=2)      &#39;args&#39; => 
        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中文網。

相關推薦:

講解php 出現Warning: A non-numeric value encountered問題的原因及解決方法

使用mysql在終端執行sql並把結果寫入檔案的方法

透過mysql比對兩個資料庫表結構的方法


以上是如何透過php 實作debug_backtrace方法追蹤程式碼調用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn