PHP 개발 중에 디버깅은 매우 중요한 단계입니다. 특히 복잡한 응용 분야에서 오류 및 예외는 종종 추적하기 어려워집니다. 개발자가 문제를 찾도록 촉진하기 위해 PHP는 다중 디버깅 도구를 제공하며, 그 중 Debug_backTrace 및 GetTraceAsString 기능은 매우 일반적으로 사용되는 두 가지 도구입니다. 그들은 개발자가 프로그램의 실행 프로세스를 추적하고 자세한 스택 정보를 생성하도록 도울 수 있습니다.
Debug_backtrace 함수는 PHP의 내장 디버깅 도구로 현재 코드 실행의 스택 정보를 반환 할 수 있습니다. 이 정보에는 일반적으로 각 함수 호출의 파일 이름, 줄 번호, 함수 이름, 매개 변수 등이 포함됩니다. 반환 된 스택 정보는 배열로 표시되며 각 항목은 함수 호출을 나타냅니다.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">testFunc</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$param</span></span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">debug_backtrace</span></span><span>());
}
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">outerFunc</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">testFunc</span></span><span>(</span><span><span class="hljs-string">'Hello'</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">outerFunc</span></span><span>();
</span></span> <span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>) {
[</span><span><span class="hljs-number">0</span></span><span>]=>
</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-number">6</span></span><span>) {
[</span><span><span class="hljs-string">"file"</span></span><span>]=> </span><span><span class="hljs-keyword">string</span></span><span>(</span><span><span class="hljs-number">35</span></span><span>) </span><span><span class="hljs-string">"/path/to/your/script.php"</span></span><span>
[</span><span><span class="hljs-string">"line"</span></span><span>]=> </span><span><span class="hljs-keyword">int</span></span><span>(</span><span><span class="hljs-number">8</span></span><span>)
[</span><span><span class="hljs-string">"function"</span></span><span>]=> </span><span><span class="hljs-keyword">string</span></span><span>(</span><span><span class="hljs-number">9</span></span><span>) </span><span><span class="hljs-string">"testFunc"</span></span><span>
[</span><span><span class="hljs-string">"args"</span></span><span>]=> </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>) { [</span><span><span class="hljs-number">0</span></span><span>]=> </span><span><span class="hljs-keyword">string</span></span><span>(</span><span><span class="hljs-number">5</span></span><span>) </span><span><span class="hljs-string">"Hello"</span></span><span> }
[</span><span><span class="hljs-string">"object"</span></span><span>]=> </span><span><span class="hljs-literal">NULL</span></span><span>
[</span><span><span class="hljs-string">"type"</span></span><span>]=> </span><span><span class="hljs-keyword">string</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>) </span><span><span class="hljs-string">"->"</span></span><span>
}
}
</span></span>결과에서 볼 수 있듯이 Debug_backtrace는 각 호출의 세부 사항을 반환합니다. 여기에는 파일 경로, 코드 줄 번호, 함수 이름, 들어오는 매개 변수 등이 포함됩니다.
gettraceasstring 함수는 예외의 스택 정보를 읽기 쉬운 문자열 형식으로 변환하는 예외 클래스의 방법입니다. 일반적으로 다중선 문자열을 반환하고 각 줄은 함수 호출을 나타냅니다. 이 방법은 예외를 포착 할 때 전체 스택 정보를 인쇄하는 데 특히 적합합니다.
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">"Something went wrong"</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getTraceAsString</span></span><span>();
}
</span></span> <span><span><span class="hljs-selector-id">#0</span></span><span> /path/</span><span><span class="hljs-selector-tag">to</span></span><span>/your/script</span><span><span class="hljs-selector-class">.php</span></span><span>(</span><span><span class="hljs-number">12</span></span><span>): throw new </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Something went wrong'</span></span><span>)
#</span><span><span class="hljs-number">1</span></span><span> {</span><span><span class="hljs-selector-tag">main</span></span><span>}
</span></span>현재 GetTraceAsString은 예외의 스택 정보를 문자열로 출력하고 예외가 발생하는 위치와 관련 통화 체인을 표시합니다.
Debug_backtrace 및 GetTraceAsString은 모두 스택 정보를 얻기 위해 별도로 사용할 수 있지만 때로는 더 포괄적 인 디버그 정보가 필요할 수 있습니다. 이 두 기능을 결합하면 프로그램 실행의 각 단계를 더 잘 추적하여 문제를 정확히 찾아 낼 수 있습니다.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">exampleFunction</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-variable">$trace</span></span><span> = </span><span><span class="hljs-title function_ invoke__">debug_backtrace</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Stack Trace from debug_backtrace:\n"</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$trace</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$index</span></span><span> => </span><span><span class="hljs-variable">$entry</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"#"</span></span><span> . </span><span><span class="hljs-variable">$index</span></span><span> . </span><span><span class="hljs-string">" "</span></span><span> . </span><span><span class="hljs-variable">$entry</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>] . </span><span><span class="hljs-string">"("</span></span><span> . </span><span><span class="hljs-variable">$entry</span></span><span>[</span><span><span class="hljs-string">'line'</span></span><span>] . </span><span><span class="hljs-string">"): "</span></span><span> . </span><span><span class="hljs-variable">$entry</span></span><span>[</span><span><span class="hljs-string">'function'</span></span><span>] . </span><span><span class="hljs-string">"()\n"</span></span><span>;
}
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">"Custom Exception for Debugging"</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"\nException Trace using getTraceAsString:\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getTraceAsString</span></span><span>();
}
}
</span><span><span class="hljs-title function_ invoke__">exampleFunction</span></span><span>();
</span></span> <span><span>Stack Trace </span><span><span class="hljs-selector-tag">from</span></span><span> debug_backtrace:
#</span><span><span class="hljs-number">0</span></span><span> /path/to/your/script.</span><span><span class="hljs-built_in">php</span></span><span>(</span><span><span class="hljs-number">9</span></span><span>): </span><span><span class="hljs-built_in">exampleFunction</span></span><span>()
Exception Trace using getTraceAsString:
#</span><span><span class="hljs-number">0</span></span><span> /path/to/your/script.</span><span><span class="hljs-built_in">php</span></span><span>(</span><span><span class="hljs-number">15</span></span><span>): throw new </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Custom Exception for Debugging'</span></span><span>)
#</span><span><span class="hljs-number">1</span></span><span> {</span><span><span class="hljs-selector-tag">main</span></span><span>}
</span></span>debug_backtrace는 현재 실행의 스택 정보를 출력하여 /spath/to/your/script.php 의 9 행에서 exampleFunction 함수가 호출되었음을 알려줍니다.
getTraceAsString 예외를 포착하여 예외가 발생할 때 스택 정보를 출력합니다. 각 기능 호출 스택이 문자열로 표시되는보다 간소화 된 스택 정보를 제공합니다.
Debug_backtrace : Debug_backtrace는 현재 실행 프로세스의 전체 스택 정보를 보려면 매우 좋습니다. 파일 경로, 줄 번호, 기능 매개 변수 등을 포함한 자세한 통화 정보를 제공 할 수 있습니다.
GetTraceAsString : 예외를 처리하고 간결한 스택 정보를 출력하려면 GetTraceAsString이 더 적용됩니다. 읽기 쉬운 형식으로 스택 정보를 반환 할 수있어 문제를 쉽게 찾을 수 있습니다.
Debug_backtrace 와 GetTraceAsString을 결합하여 PHP 개발자는보다 포괄적이고 명확한 디버깅 정보를 얻을 수 있습니다. Debug_backtrace는 정확한 통화 체인 정보를 제공하는 반면 GetTraceAsString은 예외 스택 정보를 문자열로 반환합니다. 이 둘의 조합은 개발자가 오류를 추적하고 문제를보다 효율적으로 찾아 내고 디버깅 중에 개발 효율성을 향상시키는 데 도움이 될 수 있습니다.