新卒で入社し、既存のwebサービスのデバッグ作業をしているのですが、
ブラウザからのリクエストに対してレスポンスに至るまでのファイルが多すぎて、バグがどのファイルなのか追いきれず困っています。
というか、バグがどこか以前に、そもそもどのファイルが処理されているのか全てを把握し切れていません。
そこで、
ブラウザからのリクエストURLはアクセスログで簡単にわかるわけですが、インクルードされたファイルや、使用したクラスのファイルといった処理された全てのファイルが知りたいです。
PHPのプロセスが処理したファイル全てを一覧できるログなどを出力できないのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/01 04:03
回答2件
0
PHPに限らず、ロギングの方法は 設計 の問題です。言い換えると、システムの仕様について詳細を知らないと回答が非常に難しいです。
ですから、サンデープログラマーならともかく、仕事として既存システムのデバッグをするのであれば、身近な先輩に尋ねるのが筋ではないでしょうか?
とはいえ、せっかくご質問頂いたので、ヒントをいくらか記載致します。
先ず、そのシステムはPHPを使って フルスクラッチ で作成されたものですか?
もしそうなら、ロギング方法を含めデバッグに役立つ仕組みが作り込まれているはずなので、作者に尋ねる(仕様書を読む)のが早道です。
万一、そうした配慮の欠けた残念なシステムの場合については後ほど。
もし対象のシステムが、例えば CakePHP のようなフレームワークを使用して開発されたものならば、ロギングのような基本的な機能はフレームワーク側で準備していることが多いので、そのマニュアルを良く読んでください。多くの場合、設定を変えるだけで望みの情報をログ出力させることが出来ると思います。
その場合でも、先ずはフレームワークの基本原理をしっかりと理解してください。
ファイルの依存関係はフレームワークの流儀に従っているはずなので、仕組みを理解しているのとそうでないのでは、デバッグの効率が大きく異なってきますので。
最後に、やはりある程度自前でデバッグの為の準備が必要な場合、先ずは以下のようなキーワードでぐぐってみてください。
PHP デバッグ
PHP ロギング
そうすれば、先人たちの知恵が容易かつたくさん得られる事と思います。
その中からご自身で使いやすい方法を組み合わせてみてください。
システムの改善案件(保守性の改善)でない限り、時間を掛けて包括的なロギングの仕組みを作り込む必要はないので、要所要所で必要最小限の情報をロギングするようにすれば良いと思います。
また、View(プレゼンテーション層)のデバッグでは、ソースを追いかける前にブラウザの開発者ツール等を利用し、HTTPレスポンスの内容を精査する事もデバッグに大いに役立ちます。
デバッグは経験の差が大きくモノをいう分野なので、慣れるまでは大変でしょうが、諸先輩のテクニックを盗みつつ気長に頑張ってください。
以上、幾らかでもご参考になれば幸いです。
投稿2016/09/01 04:38
総合スコア5936
0
ベストアンサー
PHPで作成されたWEBアプリはデバッグしにくいですよね。
以下の方法でファイルのトレースを出せます。
・ターミナルを2つ開きます。
ターミナル1
Apacheの親プロセスを特定する。
$ ps -aef | grep httpd | grep -v grep apache 379 2876 0 13:06 ? 00:00:00 /usr/sbin/httpd apache 380 2876 0 13:06 ? 00:00:00 /usr/sbin/httpd apache 382 2876 0 13:06 ? 00:00:00 /usr/sbin/httpd apache 384 2876 0 13:06 ? 00:00:00 /usr/sbin/httpd apache 385 2876 0 13:06 ? 00:00:00 /usr/sbin/httpd apache 386 2876 0 13:06 ? 00:00:00 /usr/sbin/httpd apache 387 2876 0 13:06 ? 00:00:00 /usr/sbin/httpd apache 388 2876 0 13:06 ? 00:00:00 /usr/sbin/httpd apache 389 2876 0 13:06 ? 00:00:00 /usr/sbin/httpd apache 390 2876 0 13:06 ? 00:00:00 /usr/sbin/httpd root 2876 1 0 May19 ? 00:03:52 /usr/sbin/httpd rootで動いてるのが親プロセスなので、プロセスIDは2876 $ sudo strace -f -p 2876 -e trace=file
ターミナル2
$ sudo service httpd reload
これを行って、WEBアプリにブラウザからアクセスすると、
ターミナル1のほうに開いたファイルがボロボロトレースされます。
トレースサンプル
Process 2876 attached --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=416, si_uid=0} --- --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=2876, si_uid=0} --- --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=390, si_status=0, si_utime=0, si_stime=0} --- --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=384, si_status=0, si_utime=4, si_stime=1} --- --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=382, si_status=0, si_utime=1, si_stime=1} --- --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=385, si_status=0, si_utime=0, si_stime=0} --- --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=380, si_status=0, si_utime=0, si_stime=1} --- --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=388, si_status=0, si_utime=0, si_stime=0} --- --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=379, si_status=0, si_utime=46, si_stime=8} --- access("/tmp/httpd_lua_shm.2876", F_OK) = 0 unlink("/tmp/httpd_lua_shm.2876") = 0 access("/var/run/httpd/authdigest_shm.2876", F_OK) = 0 unlink("/var/run/httpd/authdigest_shm.2876") = 0 open("/etc/httpd/conf/httpd.conf", O_RDONLY|O_CLOEXEC) = 7 stat("/etc/httpd", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 openat(AT_FDCWD, "/etc/httpd/conf.modules.d", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 8 stat("/etc/httpd/conf.modules.d/00-base.conf", {st_mode=S_IFREG|0644, st_size=3282, ...}) = 0 open("/etc/httpd/conf.modules.d/00-base.conf", O_RDONLY|O_CLOEXEC) = 8 open("/etc/httpd/modules/mod_access_compat.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_actions.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_alias.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_allowmethods.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_auth_basic.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_auth_digest.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authn_anon.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authn_core.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authn_dbd.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authn_dbm.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authn_file.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authn_socache.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authz_core.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authz_dbd.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authz_dbm.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authz_groupfile.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authz_host.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authz_owner.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_authz_user.so", O_RDONLY|O_CLOEXEC) = 15 open("/etc/httpd/modules/mod_autoindex.so", O_RDONLY|O_CLOEXEC) = 15 stat("/etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned", 0x7ffecbc46a80) = -1 ENOENT (No such file or directory)
PHPファイル(拡張子.php)だけに絞りたいなら楽観的な対応として次のようにしてください。
sudo strace -f -p 2876 -e trace=file 2>&1 | grep \\.php
投稿2016/09/01 04:14
編集2016/09/01 04:18総合スコア6621
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/01 06:55 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。