ログ出力 - どうやってPHPスクリプトをデバッグしますか?




php デバッグツール (20)

phpdbg.com

対話式ステップスルーPHPデバッガはSAPIモジュールとして実装されているため、コードの機能やパフォーマンスに影響を与えることなく、環境を完全に制御できます。 これは、PHP 5.4以降のための軽量でパワフルで使いやすいデバッグプラットフォームを目指しており、PHP 5.6と一緒に出荷されます。

機能は次のとおりです。

  • ステップスルーデバッグ
  • 柔軟なブレークポイント(クラスメソッド、関数、ファイル:行、アドレス、オペコード)
  • 組み込みのeval()でPHPに簡単にアクセス
  • 現在実行中のコードに簡単にアクセス
  • ユーザーランドAPI
  • SAPI Agnostic - 簡単に統合できる
  • PHP設定ファイルのサポート
  • JITスーパーグローバル - あなた自身のものを設定しよう!
  • オプションのreadlineサポート - 快適なターミナル操作
  • リモートデバッグサポート - バンドルされたJava GUI
  • 簡単操作

スクリーンショットを参照してください。

ホームページ: phpdbg.com : phpdbg.com

PHPエラー - PHPのエラー 報告の改善

これはあなたのPHPスクリプトをデバッグするのに非常に使いやすいライブラリ(実際にはファイル)です。

あなたがする必要がある唯一の事は以下のように一つのファイルをインクルードすることです(あなたのコードの始めに):

require('php_error.php');
\php_error\reportErrors();

それからすべてのエラーはバックトレース、コードコンテキスト、関数の引数、サーバー変数などのような情報をあなたに与えるでしょう。例えば:

機能は次のとおりです。

  • 使用するのは簡単です、それはただ一つのファイルです
  • 通常のリクエストとajaxyリクエストに対してブラウザに表示されるエラー
  • AJAXリクエストは一時停止されているため、自動的に再実行できます。
  • エラーをできる限り厳密にする(コードの品質を高め、パフォーマンスを向上させる傾向がある)
  • スタックトレース全体のコードスニペット
  • より多くの情報を提供します(全機能シグニチャーなど)
  • 単に間違っているいくつかのエラーメッセージを修正しました
  • 構文の強調表示
  • きれいに見えます!
  • カスタマイズ
  • 手動でオン/オフにする
  • エラー報告なしで特定のセクションを実行する
  • ファイルを無視して、スタックトレース内のコードの強調表示を回避できるようにします。
  • アプリケーションファイル これらはエラーが発生したときに優先されます。

ホームページ: http : //phperror.net/

GitHub: https://github.com/JosephLenton/PHP-Error : https://github.com/JosephLenton/PHP-Error

私のフォーク(追加修正あり): https://github.com/kenorb-contrib/PHP-Error : https://github.com/kenorb-contrib/PHP-Error

DTrace

お使いのシステムが DTrace動的トレース (OS Xにデフォルトでインストールされている)をサポートしていて、デフォルトでDTraceプローブが有効( --enable-dtrace )になっている場合、このコマンドは時間がかからずにPHPスクリプトをデバッグできます。 :

sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'

したがって、次のエイリアスが rc ファイルに追加されているとします(例: ~/.bashrc~/.bash_aliases )。

alias trace-php='sudo dtrace -qn "php*:::function-entry { printf(\"%Y: PHP function-entry:\t%s%s%s() in %s:%d\n\", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }"'

あなたは覚えやすいエイリアスであなたのスクリプトをトレースすることができます: trace-php

これはより高度なdtraceスクリプトです dtruss-php.d 保存し、実行可能にして( chmod +x dtruss-php.d )、実行します。

#!/usr/sbin/dtrace -Zs
# See: https://github.com/kenorb/dtruss-lamp/blob/master/dtruss-php.d

#pragma D option quiet

php*:::compile-file-entry
{
    printf("%Y: PHP compile-file-entry:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1));
}

php*:::compile-file-return
{
    printf("%Y: PHP compile-file-return:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), basename(copyinstr(arg1)));
}

php*:::error
{
    printf("%Y: PHP error message:\t%s in %s:%d\n", walltimestamp, copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::exception-caught
{
    printf("%Y: PHP exception-caught:\t%s\n", walltimestamp, copyinstr(arg0));
}

php*:::exception-thrown
{
    printf("%Y: PHP exception-thrown:\t%s\n", walltimestamp, copyinstr(arg0));
}

php*:::execute-entry
{
    printf("%Y: PHP execute-entry:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}

php*:::execute-return
{
    printf("%Y: PHP execute-return:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}

php*:::function-entry
{
    printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::function-return
{
    printf("%Y: PHP function-return:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::request-shutdown
{
    printf("%Y: PHP request-shutdown:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}

php*:::request-startup
{
    printf("%Y, PHP request-startup:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}

ホームページ:GitHubの dtruss-lamp

これが簡単な使い方です。

  1. sudo dtruss-php.d 実行します。
  2. 別の端末で実行してください php -r "phpinfo();"

それをテストするには、 index.php を使って任意のdocrootに行き、次のようにしてPHP組み込みサーバーを実行します。

php -S localhost:8080

その後、あなたは http://localhost:8080/ でそのサイトにアクセスすることができます(あるいはあなたに便利なポートを選択する)。 そこから、トレース出力を見るためにいくつかのページにアクセスします。

注意:DtraceはデフォルトでOS Xで利用可能です。Linuxではおそらく dtrace4linux が必要か、他の alternatives が dtrace4linux か確認してください。

参照:php.netで PHPとDTrace を使う

SystemTap

あるいは、SystemTap SDT開発パッケージをインストールしてSystemTapトレースを確認します(例: yum install systemtap-sdt-devel )。

これは、SystemTapでPHPスクリプトを実行している間、すべてのコアPHP静的プローブポイントをトレースするためのスクリプト例( all_probes.stp )です。

probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
    printf("Probe compile__file__entry\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
    printf("Probe compile__file__return\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
    printf("Probe error\n");
    printf("  errormsg %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
    printf("Probe exception__caught\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
    printf("Probe exception__thrown\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
    printf("Probe execute__entry\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
    printf("Probe execute__return\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
    printf("Probe function__entry\n");
    printf("  function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
    printf("Probe function__return: %s\n", user_string($arg1));
    printf(" function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
    printf("Probe request__shutdown\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
    printf("Probe request__startup\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}

使用法:

stap -c 'sapi/cli/php test.php' all_probes.stp

参照:php.netの PHP DTrace静的プローブ での SystemTapの使用

どうやって PHP スクリプトをデバッグしますか?

私はエラー報告の使用などの基本的なデバッグを知っています。 PHPEclipse のブレークポイントデバッグも非常に便利です。

phpStormや他のIDEでデバッグする のに (速くて簡単な) 最も良い 方法は何ですか?


1)print_r()を使います。 TextMateでは、これを拡張した 'pre'のスニペットがあります。

echo "<pre>";
print_r();
echo "</pre>";

2)Xdebugを使っていますが、Mac上でGUIを正しく動作させることができませんでした。 少なくともスタックトレースの読み取り可能なバージョンを表示します。


Komodo IDEは、リモートデバッグでもxdebugとうまく動作します。 最小限の設定が必要です。 必要なのは、コモドがブレークポイントでコードをステップ実行するためにローカルで使用できるphpのバージョンだけです。 スクリプトをkomodoプロジェクトにインポートした場合は、Eclipse内でJavaプログラムをデバッグするための設定方法と同じように、マウスクリックでブレークポイントを設定できます。 MACまたはLinuxデスクトップの場合は設定が簡単なローカルデバッグ設定よりも、リモートデバッグを正しく機能させるには(リモートワークスペース内のphpスクリプトを使用してリモートURLをマッピングする必要がある場合があります)、明らかにトリッキーです。 。


Nusphereはphp nusphere 用の優れたデバッガでもあります。


PhpEdは本当にいいです。 あなたは関数の中に/上に/外に出ることができます。 アドホックコードを実行したり、変数を調べたり、変数を変更したりできます。 すごいですね。


Railsが不可能なときは、私はCakePHPをよく使います。 エラーをデバッグするために、私は通常tmpフォルダの中に error.log を見つけて、それをコマンドで端末の中に error.log ています...

tail -f app/tmp/logs/error.log

何が起こっているかのケーキからダイアログを実行することができます。使用できるコードの途中で何かを出力したい場合は、これは非常に便利です。

$this->log('xxxx');

これは通常、何が起きているのか、何が間違っているのかをよく知ることができます。


print_r / echoを使用して解決するには時間がかかりすぎるという非常に厄介な問題については、私のIDE(PhpEd)のデバッグ機能を使用します。 私が使った他のIDEとは異なり、PhpEdはほとんどセットアップを必要としません。 私が遭遇する問題のためにそれを使わない唯一の理由はそれが 痛いほど 遅いということです。 遅さがPhpEdや他のphpデバッガに特有のものであるかどうかはわかりません。 PhpEdは無料ではありませんが、とにかく(前述のXDebugのような)オープンソースのデバッガの1つを使っていると思います。 また、PhpEdの利点は、セットアップが不要なことです。これは、私が過去に非常に退屈な作業をしたことがあることがわかっています。


print_r(debug_backtrace());

またはそのようなもの:-)


あなたがあなたの出力をめちゃくちゃにしたくないならば、出力バッファリングは非常に役に立ちます。 私はこれをワンライナーで行っていますが、これは自由にコメント/コメント解除できます

 ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();

あなたが言及したようなデバッグ機能を持つEclipse環境をセットアップするために Eclipse PDT を試してください。 コードにステップインする機能は、var_dumpの古いメソッドをデバッグしてさまざまな時点で印刷し、フローのどこに問題があるかを確認するためのはるかに優れた方法です。 それでも他のすべてが失敗し、私が持っているのがSSHとvimだけである場合でも、コードが南に行く場所を見つけるために var_dump() / die() を実行します。


これは私の小さなデバッグ環境です。

error_reporting(-1);
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_BAIL, 0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, 'assert_callcack');
set_error_handler('error_handler');
set_exception_handler('exception_handler');
register_shutdown_function('shutdown_handler');

function assert_callcack($file, $line, $message) {
    throw new Customizable_Exception($message, null, $file, $line);
}

function error_handler($errno, $error, $file, $line, $vars) {
    if ($errno === 0 || ($errno & error_reporting()) === 0) {
        return;
    }

    throw new Customizable_Exception($error, $errno, $file, $line);
}

function exception_handler(Exception $e) {
    // Do what ever!
    echo '<pre>', print_r($e, true), '</pre>';
    exit;
}

function shutdown_handler() {
    try {
        if (null !== $error = error_get_last()) {
            throw new Customizable_Exception($error['message'], $error['type'], $error['file'], $error['line']);
        }
    } catch (Exception $e) {
        exception_handler($e);
    }
}

class Customizable_Exception extends Exception {
    public function __construct($message = null, $code = null, $file = null, $line = null) {
        if ($code === null) {
            parent::__construct($message);
        } else {
            parent::__construct($message, $code);
        }
        if ($file !== null) {
            $this->file = $file;
        }
        if ($line !== null) {
            $this->line = $line;
        }
    }
}

ほとんどのバグは単にいくつかの重要な変数を var_dump することで簡単に見つけることができますが、それは明らかにあなたがどの種類のアプリケーションを開発するかに依存します。

より複雑なアルゴリズムの場合、step / breakpoint / watch関数は非常に便利です(必要でなければ)。


コーディング時に無数の時間を節約できるPHPのデバッグ手法はたくさんあります。 効果的だが基本的なデバッグ手法は、単にエラー報告を有効にすることです。 もう少し高度なテクニックとしてprintステートメントを使うことがあります。これは実際に起こっていることを画面に表示することで、よりとらえどころのないバグを特定するのに役立ちます。 PHPeclipseは、一般的な構文エラーを強調表示し、ブレークポイントを設定するためにデバッガーと一緒に使用できるEclipseプラグインです。

display_errors = Off
error_reporting = E_ALL 
display_errors = On

そしてまた使用される

error_log();
console_log();

コードをステップスルーするにつれて変数の値が変化するのを見ることができる統合デバッガは、とてもクールです。 ただし、サーバー上でソフトウェアをセットアップし、クライアント上で一定量の構成を必要とします。 どちらも、正常に機能するために定期的なメンテナンスが必要です。

print_rは書きやすく、どんな設定でも動作することが保証されています。


手動デバッグは私にとって一般的に速いです - var_dump()debug_print_backtrace() はあなたがあなたの論理を debug_print_backtrace() するのに必要なすべてのツールです。


正直なところ、変数を出力するためのprintとprint_r()の組み合わせです。 私は多くの人が他のより高度な方法を使うことを好むことを知っていますが、私はこれが最も使いやすいと思います。

私は、Uniでマイクロプロセッサプログラミングをして、これさえも使用できなくなるまで、これを十分に理解していなかったと言います。


私はXDebugでNetbeansを使います。 設定方法については、Webサイトで確認してください。 http://php.netbeans.org/


私はXDebugと Easy XDebug FireFoxアドオンで Netbeansを 使います

NetCansでXDebugを実行する通常の方法は、URLを介してdbugセッションを登録することなので、MVCプロジェクトをデバッグするときにはアドオンが不可欠です。 アドオンをFireFoxにインストールしたら、Netbeansプロジェクトのプロパティ - > Run Configuratuion - > Advancedの順に選択し、 "Do Not Open Web Browser"を選択します。ブレークポイントを設定し、通常どおりCtrl-F5でデバッグセッションを開始できます。 。 FireFoxを開き、右下隅にあるアドオンアイコンを右クリックしてブレークポイントの監視を開始します。 コードがブレークポイントに達すると停止し、変数の状態と呼び出しスタックを調べることができます。


私は組み込みのデバッガで日食のためにzendスタジオを使います。 xdebugを使ったeclipse pdtを使ったデバッグに比べて、まだ遅いです。 うまくいけば、彼らはこれらの問題を解決するでしょう、スピードは最近のリリースよりも向上していますが、それでも物事を乗り越えるには2-3秒かかります。 zend Firefoxのツールバーは本当に物事を簡単にします(次のページ、現在のページなどのデバッグ)。 また、あなたのコードをベンチマークし、円グラフ、実行時間などを提供するプロファイラーを提供します。


通常、ファイルに保存し、デバッグ情報を保存し、最終的に共通のフッターに再印刷できるカスタムログ関数を作成します。

このタイプのデバッグが半自動化されるように、一般的なExceptionクラスをオーバーライドすることもできます。





xdebug