Memo/PHP/Xdebug

https://dexlab.net:443/pukiwiki/index.php?Memo/PHP/Xdebug
 

Memo/PHP

Xdebugでスタックトレース

特徴

Xdebug http://www.xdebug.org/index.php

  • 無償
  • Windows用コンパイル済みバイナリがある
  • 無限ループ保護
  • プロファイリング
  • スクリプト実行分析
  • デバッグクライアントでインタラクティブにスクリプトをデバッグする機能

他のデバック/プロファイリングソフトは以下がある模様。

名前価格説明
Zend Studio41,000円PHP開発元
apd無償Windowsではコンパイルが必要
PHP Dyn無償Windowsではコンパイルが必要

WinCacheGrind?

インストール

Windows

  1. phpをダウンロード PHP For Windows: Binaries and sources Releases php 5.3.8 VC9 x86 Thread Safe
    • php-5.3.8-Win32-VC9-x86.zip
  2. xdebugをダウンロード Xdebug: Downloads
    • php_xdebug-2.1.2-5.3-vc9.dll
  3. c:\php\ext\にコピー
    C:\php\ext\php_xdebug-2.1.2-5.3-vc9.dll
  4. c:\php\php.ini に追加。ログの保存場所は適当に
    [XDebug]
    zend_extension=c:\\php\\ext\\php_xdebug-2.1.2-5.3-vc9.dll
    xdebug.profiler_enable=1
    xdebug.profiler_output_dir="D:\\temp"
    xdebug.profiler_output_name = xdebug.%s
  5. モジュールが有効かの確認
    c:\> php -m | find "Xdebug"
    Xdebug
  6. 以後phpを実行すると、ログが出力される。実行後は速度が落ちるのでプロファイル終了後は、「xdebug.profiler_enable=0」にしておく

Linux

yum install php-devel php-pear

pecl install xdebug
cat >> /etc/php.d/xdebug.ini << 'EOS'
zend_extension=/usr/lib/php/modules/xdebug.so
xdebug.profiler_enable=0
EOS
service httpd graceful
  • プロファイル開始。かなり負荷がかかるため、本番環境では必ず0にする事
    perl -p -i -e 's#xdebug.profiler_enable=0#xdebug.profiler_enable=1#' "/etc/php.d/xdebug.ini"
    service httpd graceful
  • プロファイル終了
    perl -p -i -e 's#xdebug.profiler_enable=1#xdebug.profiler_enable=0#' "/etc/php.d/xdebug.ini"
    service httpd graceful
  • .htaccessが使える場合
    cat >> .htaccess << 'EOS'
    php_flag xdebug.profiler_enable 1
    EOS
  • デフォルトではtmp以下にファイルができている
    /tmp/cachegrind.out.28996

確認

apacheの再起動。
phpinfo();で確認する。

<? phpinfo(); ?>

「xdebug」の項目が表示されていればOK。
trigger_error();でスタックトレースが表示されれば成功。

デバック時にGET, POST, SESSION等の情報も表示する

php.iniに以下の行を追加する。
apacheを再起動。

	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	; for Xdebug
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;xdebug.dump.COOKIE
	;xdebug.dump.ENV
	;xdebug.dump.FILES
	xdebug.dump.GET=*
	xdebug.dump.POST=*
	;xdebug.dump.REQUEST
	;xdebug.dump.SERVER
	xdebug.dump.SESSION=*

プロファイル情報を出力する

php.iniに以下の行を追加する。
c:/php/xdebug/ディレクトリを作成。
apacheを再起動。

echo "xdebug.profiler_enable = 1" >> /etc/php.d/xdebug.ini
service httpd graceful

で、phpプログラムを実行すると、「C:\PHP\xdebug\xdebug_1106716852_3456.txt」のようなファイルができます。
実行された関数名とそれにかかった時間等の情報が出力されます。

	Execution Time Profile (sorted by execution time)
	-----------------------------------------------------------------------------------
	Time Taken    Number of Calls    Function Name    Location
	-----------------------------------------------------------------------------------
	0.0033779144    1    *{main}()    c:\user\www\htdocs\php\phpinfo.php:0
	0.0032899380    1    phpinfo()    c:\user\www\htdocs\php\phpinfo.php:2
	-----------------------------------------------------------------------------------
	Opcode Compiling:                             0.0023498535
	Function Execution:     0.0032899380
	Ambient Code Execution: 0.0876271725
	Total Execution:                              0.0909171104
	-----------------------------------------------------------------------------------
	Total Processing:                             0.0932669640
	-----------------------------------------------------------------------------------
	End of function profiler

特定の部分のプロファイルを出力する

特定の部分のプロファイリングをするには、xdebug_start_profiling()、xdebug_stop_profiling()を使用する。

xdebug_start_profiling();
// 処理...
xdebug_dump_function_profile(); // 2つのテーブルで表示。
echo "<pre>";
var_export(xdebug_get_function_profile()); // プロファイル情報を配列で返す
xdebug_stop_profiling();

アナライザ

リンク


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:38 (5d)