PHPでエラーが発生すると、エラーメッセージとそのエラーの発生したファイル名や行番号がWebブラウザに表示されます。XDebugをインストールすると、これらの情報に加え、エラーが発生した部分のコールスタック情報も自動的に画面に現れるようになります。
コールスタックとは、プログラムの実行過程をたどったもので、関数やメソッドの呼び出し履歴と、その際の引数などを確認できます。XDebugが提供するxdebug_print_function_stack()関数を使うと、詳細なコールスタック情報を得られます。
この関数を使うときは、設定ファイルphp.iniに「xdebug.collect_params」という設定を記述し、どの程度精密に調べるかを決めておきましょう。初期値(php.iniに何も記述しない状態)は「0」になっており、この設定では引数の詳しい情報を表示しません(表2)。
設定値 | 表示する引数情報 |
---|---|
0 | 引数情報を表示しない |
1 | 引数のデータ型だけを表示 |
2 | 引数のデータ型を表示。その内容もツールチップ形式で表示 |
3 | 引数の内容を表示 |
4 | 引数の内容に加えて引数名も表示 |
表2 xdebug.collect_paramsの設定値と、出力する引数情報の精度 |
xdebug.collect_paramsの値に4を設定し、以下のプログラムを実行してみてください。PHPエラーが発生しなくても、xdebug_print_function_stack()関数を呼び出すことで、コールスタックを出力できることが分かると思います(図8)。出力されたコールスタックには、関数の呼び出し履歴、その時間、メモリ使用量、具体的な呼び出し引数、そしてその関数が宣言されているコードの位置が表示されます。
<?php function func1($param) { return func2($param, "calling func2"); } function func2($param1, $param2, $param3 = "default") { xdebug_print_function_stack(); } func1("hello");
今回紹介した以外にも多くの機能が備わっています。詳細な解説は次回に回しますが、「リモートデバッグ」「コードプロファイラ」「コードカバレッジ」の主要な3機能がどんなものか簡単に紹介します。
リモートデバッグは、XDebug対応のデバッガを通して、ブレークポイントの設定やコードのステップ実行を可能にする機能です。
コードプロファイラとは、プログラムが動作したときの、関数やメソッド単位での実行時間を記録するものです。コードプロファイラを使うと、ソースコードで特に処理が遅い部分や冗長な部分を発見でき、ボトルネックの解消につながります。こちらもデバッグとは性質の異なる機能ですが、検証段階で重宝する機能です。
コードカバレッジとは、プログラムを実行したとき、ソースコード中の実行した部分の割合を示します。例えば、コードカバレッジが80%という事は、ソースコード中で実行されなかった部分が20%あるということです。XDebugはコードカバレッジを計測する機能を備えています。
これは、ホワイトボックステストと呼ぶソフトウェアテストで役立ちます。XDebugを使うと、ファイル単位でコードカバレッジを取得できます。コードカバレッジはデバッグというよりソフトウェアテストに向けた機能となりますが、本格的なPHPアプリケーション開発では、ソフトウェアテストは欠かせないものになりつつあります。
スクリプト言語であるPHPは、コードの修正と修正結果の確認がとても簡単にできるため、あまりデバッグに関して深く意識する必要がないと感じている方もいるかもしれません。しかし、いろいろなデバッグ手法を理解し、使いこなせるようになると、より効率よく、価値あるプログラムを開発できるようになります。
次回は、XDebugのリモートデバッグやプロファイラといった機能を紹介しながら、より高度なデバッグ法を解説します。
アシアル株式会社
田中正裕
アシアル株式会社代表取締役。根っからのプログラミング好きが高じて、ソフトウェア企業であるアシアル株式会社を設立。サーバサイド開発言語であるPHPと、iPhone/Androidなどのスマートフォンに特化し、開発者向けにソフトウェアやサービスを提供している。プロフェッショナルなエンジニアを育成するため、講座カリキュラムの開発や運営など教育事業も展開。主な著書に『超・極める!PHP(共著、翔泳社)』や『symfony×PHP(共著、技術評論社)』など。PHP技術者養成を支援する『PHP技術者認定機構』の顧問も務める。
Copyright © ITmedia, Inc. All Rights Reserved.