>백엔드 개발 >PHP 문제 >PHP에서 추적 디버깅 정보를 인쇄하는 방법

PHP에서 추적 디버깅 정보를 인쇄하는 방법

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-06-09 17:02:092261검색

이 글에서는 PHP에서 추적 및 디버깅 정보를 인쇄하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

PHP에서 추적 디버깅 정보를 인쇄하는 방법

C, Java, C# 등 대부분의 컴파일 언어의 경우 중단점 디버깅을 쉽게 수행할 수 있지만, PHP의 경우 중단점 디버깅 기능을 수행하려면 XDebug를 설치하고 편집기에서 복잡한 구성을 수행해야 합니다.

그러나 단순히 디버깅하고 스택 추적을 보는 것이라면 실제로 PHP는 프로그램이 실행될 때 프로그램의 호출 상태를 매우 편리하게 볼 수 있도록 두 가지 기능을 준비했습니다.

debug_backtrace()

이 메서드의 문자 그대로의 의미를 보면 역추적 디버깅을 의미하며 반환되는 것은 역추적 정보의 배열임을 알 수 있습니다.

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打印跟踪调试信息.php:7:
// array(1) {
//   [0] =>
//   array(4) {
//     'file' =>
//     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
//     'line' =>
//     int(12)
//     'function' =>
//     string(6) "a_test"
//     'args' =>
//     array(1) {
//       [0] =>
//       string(1) "A"
//     }
//   }
// }

이 메서드는 함수 내에서 호출되어야 합니다. 함수 메서드 외부에서 사용하면 내용이 없습니다. 내용을 보면 __FILE__, __LINE__, __FUNCTION__, $argv 및 이 함수에 대한 기타 정보가 출력됩니다. 사실 이는 현재 이 줄을 인쇄하는 함수와 관련이 있습니다.

물론 인쇄된 콘텐츠가 무엇인지 확인하기 위해 몇 가지 기능 레이어를 더 중첩할 수도 있습니다.

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打印跟踪调试信息.php:7:
// array(3) {
//   [0] =>
//   array(4) {
//     'file' =>
//     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.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打印跟踪调试信息.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打印跟踪调试信息.php"
//     'line' =>
//     int(40)
//     'function' =>
//     string(6) "b_test"
//     'args' =>
//     array(0) {
//     }
//   }
// }

예, 배열의 출력 순서는 스택의 실행 순서입니다. b_test()가 먼저 호출되므로 스택의 맨 아래에 있고 해당 출력은 배열의 마지막 요소입니다.

수업에서도 비슷하게 사용됩니다.

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打印跟踪调试信息.php:90:
// array(2) {
//   [0] =>
//   array(7) {
//     'file' =>
//     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.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打印跟踪调试信息.php"
//     'line' =>
//     int(95)
//     'function' =>
//     string(6) "test_a"
//     'class' =>
//     string(1) "A"
//     'object' =>
//     class A#1 (0) {
//     }
//     'type' =>
//     string(2) "->"
//     'args' =>
//     array(0) {
//     }
//   }
// }

클래스에서 사용하면 배열 항목에 이 메서드가 위치한 클래스에 대한 정보를 표시하는 추가 개체 필드가 ​​있습니다.

debug_backtrace()의 함수 선언은 다음과 같습니다.

debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] ) : array

$options에 정의할 수 있는 두 가지 상수가 있습니다. DEBUG_BACKTRACE_PROVIDE_OBJECT는 "객체"의 인덱스를 채울지 여부를 나타냅니다.

DEBUG_BACKTRACE_IGNORE_ARGS는 "args"의 인덱스를 무시할지 여부를 나타냅니다. , 모든 기능 포함/ 메소드의 매개변수는 메모리 오버헤드를 절약할 수 있습니다. $limits는 반환되는 스택 프레임 수를 제한하는 데 사용할 수 있습니다. 기본값은 모든 스택을 반환하는 0입니다.

debug_backtrace() 및 아래에 소개된 debug_print_backtrace() 메서드는 require/include 파일과 eval()의 코드를 지원합니다. 파일을 삽입하면 삽입된 파일의 경로가 출력됩니다.

debug_print_backtrace()

이 메소드는 역추적 내용을 직접 인쇄할 수도 있지만, $options의 기본값은 DEBUG_BACKTRACE_IGNORE_ARGS입니다. 호출이 있는 파일과 줄 번호만 인쇄합니다.

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打印跟踪调试信息.php:144]
#1  b() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:140]
#2  a() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:151]

또한 이 함수는 출력을 위해 var_dump() 또는 print_r()을 사용할 필요가 없습니다. 이 함수를 직접 사용하면 출력됩니다. 이를 통해 매우 빠르고 편리하게 디버깅할 수 있습니다.

예를 들어 laravel과 같은 대규모 프레임워크에서 컨트롤러가 스택 정보를 확인해야 하는 경우 debug_print_backtrace()를 사용하면 현재 스택 호출 상황을 빠르게 확인할 수 있습니다. debug_backtrace()에서 $options를 지정하지 않으면 매우 많은 메모리 용량을 차지하거나 완전히 표시할 수 없습니다.

요약

오늘 소개하는 두 함수는 코드를 디버그하거나 프레임워크의 호출 상황을 이해하는 데 유연하게 도움이 될 수 있습니다. 물론 공식적인 상황에서는 debug_backtrace() 메서드를 사용하여 변수의 변경 사항을 볼 수 없기 때문에 중단점 디버깅을 위해 Xdebug와 편집기 지원을 사용하는 것이 좋습니다.

테스트 코드:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202004/source/PHP%E6%89%93%E5%8D%B0%E8%B7%9F%E8%B8%AA%E8%B0%83%E8%AF%95%E4%BF%A1%E6%81%AF.php

추천 학습: php 비디오 튜토리얼

위 내용은 PHP에서 추적 디버깅 정보를 인쇄하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제