目錄
- debug_backtrace()
- debug_print_backtrace()
- 總結(jié)
對于大部分編譯型語言來說,比如 C 、 Java 、 C# ,我們都能很方便地進(jìn)行斷點調(diào)試,但是 PHP 則必須安裝 XDebug 并且在編輯器中進(jìn)行復(fù)雜的配置才能實現(xiàn)斷點調(diào)試的能力。不過,如果只是簡單的調(diào)試并且查看堆?;厮莸脑挘鋵?PHP 已經(jīng)為我們準(zhǔn)備好了兩個函數(shù),能夠讓我們非常方便的看到程序運行時的調(diào)用情況。
debug_backtrace()
從這個方法的字面意思上就可以看出,它的意思就是調(diào)試回溯,返回的也正是一段回溯信息的數(shù)組。
function a_test($str)
{
echo "Hi: $str", PHP_EOL;
var_dump(debug_backtrace());
}
var_dump(debug_backtrace());
a_test("A");
// Hi: A/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:7:
// array(1) {
// [0] =>
// array(4) {
// 'file' =>
// string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php"
// 'line' =>
// int(12)
// 'function' =>
// string(6) "a_test"
// 'args' =>
// array(1) {
// [0] =>
// string(1) "A"
// }
// }
// }
這個方法必須在函數(shù)中調(diào)用,在函數(shù)方法外部使用是不會有內(nèi)容的。從內(nèi)容中看,它輸出了關(guān)于這個函數(shù)的 __FILE__ 、 __LINE__ 、 __FUNCTION__ 、$argv 等信息。其實就是關(guān)于當(dāng)前打印這行所在函數(shù)的相關(guān)內(nèi)容。
我們當(dāng)然也可以多嵌套幾層函數(shù)來看一下打印出的內(nèi)容是什么。
function b_test(){
c_test();
}
function c_test(){
a_test("b -> c -> a");
}
b_test();
// Hi: b -> c -> a
// /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:7:
// array(3) {
// [0] =>
// array(4) {
// 'file' =>
// string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php"
// 'line' =>
// int(37)
// 'function' =>
// string(6) "a_test"
// 'args' =>
// array(1) {
// [0] =>
// string(11) "b -> c -> a"
// }
// }
// [1] =>
// array(4) {
// 'file' =>
// string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php"
// 'line' =>
// int(33)
// 'function' =>
// string(6) "c_test"
// 'args' =>
// array(0) {
// }
// }
// [2] =>
// array(4) {
// 'file' =>
// string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php"
// 'line' =>
// int(40)
// 'function' =>
// string(6) "b_test"
// 'args' =>
// array(0) {
// }
// }
// }
沒錯,數(shù)組的輸出順序就是一個棧的執(zhí)行順序,b_test() 最先調(diào)用,所以它在棧底,對應(yīng)的輸出也就是數(shù)組中的最后一個元素。
在類中也是類似的使用方法。
class A{
function test_a(){
$this->test_b();
}
function test_b(){
var_dump(debug_backtrace());
}
}
$a = new A();
$a->test_a();
// /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:90:
// array(2) {
// [0] =>
// array(7) {
// 'file' =>
// string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php"
// 'line' =>
// int(87)
// 'function' =>
// string(6) "test_b"
// 'class' =>
// string(1) "A"
// 'object' =>
// class A#1 (0) {
// }
// 'type' =>
// string(2) "->"
// 'args' =>
// array(0) {
// }
// }
// [1] =>
// array(7) {
// 'file' =>
// string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php"
// 'line' =>
// int(95)
// 'function' =>
// string(6) "test_a"
// 'class' =>
// string(1) "A"
// 'object' =>
// class A#1 (0) {
// }
// 'type' =>
// string(2) "->"
// 'args' =>
// array(0) {
// }
// }
// }
在類中使用的時候,在數(shù)組項中會多出一個 object 字段,顯示的是這個方法所在類的信息。
debug_backtrace() 的函數(shù)聲明是:
debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] ) : array
其中 options 是有兩個常量可以定義,DEBUG_BACKTRACE_PROVIDE_OBJECT 表明是否填充 "object" 的索引;DEBUG_BACKTRACE_IGNORE_ARGS 是否忽略 "args" 的索引,包括所有的 function/method 的參數(shù),能夠節(jié)省內(nèi)存開銷。limits 可用于限制返回堆棧幀的數(shù)量,默認(rèn)為0返回所有的堆棧。
debug_backtrace() 以及下面要介紹的 debug_print_backtrace() 方法都是支持 require/include 文件以及 eval() 中的代碼的,在嵌入文件時,會輸出嵌入文件的路徑,這個大家可以自行嘗試。
debug_print_backtrace()
這個方法從名稱也可以看出,它會直接打印回溯內(nèi)容,它的函數(shù)聲明和 debug_backtrace() 是一樣的,不過 $options 默認(rèn)是 DEBUG_BACKTRACE_IGNORE_ARGS ,也就是說,它只打印調(diào)用所在文件及行數(shù)。
function a() {
b();
}
function b() {
c();
}
function c(){
debug_print_backtrace();
}
a();
#0 c() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:144]
#1 b() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:140]
#2 a() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:151]
另外就是這個函數(shù)不需要使用 var_dump() 或 print_r() 進(jìn)行輸出,直接使用這個函數(shù)就會進(jìn)行輸出。能夠非常快捷方便的讓我們進(jìn)行調(diào)試,比如在 laravel 這類大型框架中,我們在控制器需要查看堆棧信息時,就可以使用 debug_print_backtrace() 快速地查看當(dāng)前的堆棧調(diào)用情況。而 debug_backtrace() 如果沒有指定 $options 的話,則會占用非常大的內(nèi)存容量或者無法完整顯示。
總結(jié)
今天介紹的這兩個函數(shù)能夠靈活地幫助我們調(diào)試代碼或者了解一個框架的調(diào)用情況。當(dāng)然,在正式的情況下還是推薦使用 Xdebug 加上編輯器的支持來進(jìn)行斷點調(diào)試,因為使用 debug_backtrace() 這兩個方法我們無法看到變量的變化情況。
測試代碼:
github.com/zhangyue050…
以上就是PHP如何打印跟蹤調(diào)試信息的詳細(xì)內(nèi)容,更多關(guān)于PHP打印調(diào)試信息的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- Ubuntu下開啟php調(diào)試模式報錯信息解決辦法
- 如何運行/調(diào)試你的PHP代碼
- PHPStorm 2020.1 調(diào)試 Nodejs的多種方法詳解
- PhpStorm+xdebug+postman調(diào)試技巧分享
- php開發(fā)最強大的IDE編輯的phpstorm 2020.2配置Xdebug調(diào)試的詳細(xì)教程
- phpStudy vscode 搭建debug調(diào)試的教程詳解
- 解決windows上php xdebug 無法調(diào)試的問題
- Vagrant(WSL)+PHPStorm+Xdebu 斷點調(diào)試環(huán)境搭建
- PhpStorm 如何優(yōu)雅的調(diào)試Hyperf的方法步驟