現在の位置: ホーム> 最新記事一覧> debug_backtraceとgettraceasstring関数を組み合わせて、より詳細なphpスタック情報を取得する方法は?

debug_backtraceとgettraceasstring関数を組み合わせて、より詳細なphpスタック情報を取得する方法は?

gitbox 2025-09-19

デバッグは、PHP開発中の非常に重要なステップです。特に複雑なアプリケーションでは、エラーと例外がしばしば追跡が困難になります。開発者が問題を見つけるように促進するために、PHPは複数のデバッグツールを提供します。その中で、 Debug_backTraceGetTraceAsstring関数は2つの非常に一般的に使用されるツールです。開発者がプロ​​グラムの実行プロセスを追跡し、詳細なスタック情報を生成するのに役立ちます。

debug_backtrace関数

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>]=&gt;
  </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>]=&gt; </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>]=&gt; </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>]=&gt; </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>]=&gt; </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>]=&gt; </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>]=&gt; </span><span><span class="hljs-literal">NULL</span></span><span>
    [</span><span><span class="hljs-string">"type"</span></span><span>]=&gt; </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">"-&gt;"</span></span><span>
  }
}
</span></span>

結果からわかるように、 debug_backtraceは各通話の詳細を返します。これには、ファイルパス、コード行番号、機能名、着信パラメーターなどが含まれます。

gettraceasstring関数

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>-&gt;</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_backtracegettraceasstringを組み合わせます

debug_backtracegettraceasstringの両方を個別に使用してスタック情報を取得できますが、より包括的なデバッグ情報が必要になる場合があります。これらの2つの機能を組み合わせることで、プログラム実行の各ステップをより適切に追跡できるため、問題を特定できます。

組み合わせの例:

 <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> =&gt; </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>-&gt;</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>

説明する:

  1. debug_backtraceは、現在の実行のスタック情報を出力し、 example機能関数が/path/to/your/script.phpの行9で呼び出されていることを示しています。

  2. GetTraceASSTRINGは、例外をキャッチして例外が発生したときにスタック情報を出力します。より合理化されたスタック情報を提供し、各関数コールスタックが文字列として表示されます。

適切な方法を選択する方法は?

  • debug_backtracedebug_backtraceは、現在の実行プロセスの完全なスタック情報を表示したい場合、非常に良い選択です。ファイルパス、行番号、関数パラメーターなどを含む詳細な通話情報を提供できます。

  • GetTraceAsString :例外を処理しており、簡潔なスタック情報を出力したい場合は、 GetTraceAsStringがより適用可能になります。読みやすい形式でスタック情報を返すことができ、問題を迅速に見つけられるようにすることができます。

まとめ

debug_backtracegettraceasstringを組み合わせることにより、PHP開発者はより包括的でより明確なデバッグ情報を取得できます。 debug_backtraceは正確なコールチェーン情報を提供しますが、 getTraceasStringは例外スタック情報を文字列として返します。この2つの組み合わせは、開発者がエラーを追跡し、問題をより効率的に見つけ、デバッグ中の開発効率を向上させるのに役立ちます。