LOGIN ID Password Auto Login Register Now! Lost Password?
XOOPS2BasicManual
About XOOPS
JavaScriptをOnでご覧ください。

9.3 デバッグモードの使い方

デバッグモードの変更

XOOPSには、何かトラブルが起きたときに、その原因を調べるためのツールとして、デバッグモードが搭載されています。

切替は基本的に管理画面の 一般設定→一般設定 で行います。「デバッグモードを有効にする」のドロップダウンから以下の4つのうちのいずれかを選択します。

  • PHPデバグ
  • MySQL/Blocksデバグ
  • Smartyデバグ
  • オフ

実は、上の3種類の「デバグ」は、機能的にはまったく独立したものであり、択一式である必然性はありません。モジュール開発者であればむしろ、PHPデ バッグをONにしたままMySQLデバッグをONにしたい、という要望も多く、本家版XOOPS 2.1/2.2 では、XOOPS 2.0.xのような択一式ではなく、3種類のデバッグモードを個別にON/OFFできる複数選択式になっています。

このような背景もあって、以下の説明では、「PHPデバグをONにする」といった表現を使っていますが、この場合、XOOPS 2.0.xでの操作としては、「デバッグモードを有効にする」について「PHPデバグ」を選択することを意味します。その逆で、「PHPデバグをOFFに する」とは、「デバッグモードを有効にする」について「オフ」を選択することを意味します。

最新版のjp版XOOPSをインストールすると、「デバッグモードを有効にする」には「PHPデバグ」が選択された状態になっています。このあたりの詳細については、 phpデバッグの問題 をご覧ください。

PHPデバグ

「PHPデバグ」とは、PHPそのものの機能を利用して、各種警告・エラーメッセージを出力するデバッグモードです。

PHPでは、スクリプトや動作に問題があると、画面にエラー文を出力するのですが、そのエラー文にはファイル名のフルパスが含まれるため、攻撃者に攻撃の手がかりを与えてしまうことになります。 *1

そこで、運用サイトでは、PHPデバグをOFFにしておいて、エラー文は出力しないようにします。「画面が真っ白になった」等の問題があった時にだけ一時 的にPHPデバグをONにして、表示されたエラー文をメモしたら、再度、OFFに戻します。運用中のサイトでは、すぐにPHPデバグをOFFにすることが 重要で、そのままにしておくと、同じエラー文を悪意ある訪問者が目にしないとも限りません。

通常、エラー文は英語で出力されます。英語が読めればそれだけでかなり解決に近づくことになりますが、英語が読めなくても意味が判らなくても、エラー文を保存しておくべきです。誰かにサポートを依頼するときには、そのエラー文を伝えるだけで、解決に大きく近づくからです。

エラー文の最初が、エラーレベルです。代表的なものとして、以下の3種類があります。

  • Notice: 「お知らせ」 比較的軽微な文法違反などで表示される
  • Warning: 「警告」 動作に問題があることが多いと思われる記述があった場合等
  • Fatal: 「致命的」 スクリプトの実行継続が不可能なエラー。いわゆる「真っ白画面」は、ほとんどの場合これが出たことによる。

より詳細なエラーレベルについては、PHPマニュアルをご覧ください。
http://jp.php.net/manual/ja/ref.erro-rfunc.php#errorfunc.constants

実のところ、エラーレベルは、スクリプトエラーの本当の重要度とは直結しません。たった一つのNoticeがXOOPSサイトの動作に重要な影響を 与えているケースもありえますし、逆に、比較的重大な警告であるはずのWarningでありながら、XOOPSにとってはほとんど意味を持たないケースも あります。こればかりは経験を積むしかないのですが、問題になるパターンは比較的限られています。

以下に、XOOPSで比較的良く見られるエラー文のパターン一覧と、それについての対処をまとめます。

Notice: Use of undefined constant (定数名) - assumed '(定数名)' in file (ファイル名) line (数字)
モジュールの作り方の問題である可能性が大です。ほとんどの場合気にしなくて構いません。他のエラー文に原因を求めましょう。
Notice: Only variables should be assigned by reference in (ファイルパス) on line (数字)
PHP4.4.0での仕様変更に伴って突然顕在化してしまった警告文です。基本的には、値渡しと参照渡しを取り違えてしまった、というXOOPSコアまたはモジュール側のコーディングミスですが、そのほとんどが無視して構わないものです。
ただ、jp版XOOPS 2.0.13a であっても、あまりにも多くのメッセージが出力されるため、本当に問題となっているエラーメッセージが見つからない方がはるかに深刻です。
Fatal error: Only variables can be passed by reference in (ファイルパス) on line (数字)
これは、Fatal error なので、このエラーが出た時点で、XOOPSは強制終了となってしまいます。PHPデバグモードがOFFであれば、いわゆる「真っ白」になります。
このエラーはおそらく、PHP5.0.5だけに存在すると思われます。参照渡しの正しい使い方を強いる、という意味では、正しいエラーと言えるのですが、 あまりにも影響が大きいためか、5.0.6以降では少なくともFatal Errorで止まることはなくなったようです。
これも、XOOPSコアまたはモジュール側のコーディングミスであるため、作者に連絡するのが一番だと思われます。
Error [Xoops]: Smarty error: unable to write to $compile_dir '(ディレクトリ名)'. Be sure $compile_dir is writable by the web server user. in file class/smarty/Smarty.class.php line (数字)
英語で書いてある通りで、コンパイル済のテンプレートキャッシュを置くべきディレクトリが、書込可能になっていません。templates_c ディレクトリのパーミッションを確認してください。
Warning [Xoops]: Smarty error: unable to read resource: "db:(テンプレート名)" in file (ファイルパス) line (数字)
モジュールインストール時または、モジュールアップデート時にこのWarningが出力されても、あまり気にする必要はありません。テンプレート処理の順 番の関係で、読み込む側のテンプレートが、読み込まれる側のテンプレートより先にコンパイル処理がなされた、というだけです。
しかし、サイト公開側の普通の画面で、このWarningが出た場合は、テンプレートの破損が考えられます。まずはモジュールアップデートを行い、それでも消えなければ、テンプレートテーブルの修復、altsysによる状況確認などが必要でしょう。
Warning [Xoops]: Smarty error: unable to read resource: "file:(テンプレートパス)" in file (ファイルパス) line (数字)
さきほどと似ていますが、dbがfileになっています。この場合、ファイルテンプレートですから、テンプレートパスの位置にファイルがあるか、読み出せるかを確認してください。
Warning [Xoops]: Smarty error: unable to read resource: "(テーマ名)/theme.html" in file (ファイルパス) line (数字)
もう一つパターンを示します。今度は、db: も file: もありません。この場合の問題はおそらくテーマでしょう。テーマディレクトリ直下にtheme.htmlがあるかどうか(パスの深さに問題がないか)、を確認してください。
Fatal error: Smarty error: [in (各種テンプレート名) line (行数)]: syntax error: (エラー種別) (Smarty_Compiler.class.php, line (数字1)) in (XOOPS_ROOT_PATH)/class/smarty/Smarty.class.php on line (数字2)
テーマやテンプレートに記述ミスがあった場合のエラーです。いくつか数字が登場しますが、ここで大事な数字は(行数)です。(各種テンプレート名)を良く 読めば、テーマなのか、DBテンプレートなのか、FILEテンプレートなのかが予想できるはずです。該当するテンプレートを探し、(行数)部分をチェック してください。
PHPデバグの問題点

エラー関連で特に明示的な指定をされずにmakeされたのPHPでは、E_WARNING以上のエラータイプが画面に出力されるようになっています。

XOOPSでは、このデフォルト設定を以下のように変更しています。(2.0.4以降)

  • PHPデバグON時
    • エラーの画面出力は強制ON *2
    • エラーのログ出力は勝手に無効化される
    • 出力エラーレベルは、強制的にE_ALL(すべて。Noticeも出力されることに注意)
  • PHPデバグOFF時
    • エラーの画面出力は勝手に無効化される
    • エラーのログ出力は勝手に無効化される
    • 出力エラーレベルは、強制的にNONE(出力なし。Fatal Errorすら出力されず、いわゆる真っ白画面になる)

PHPをご存じの方であれば、これがきわめて問題のある仕様であることはすぐにお判りだと思います。しかし、3年近くもこれについての指摘がまったく顧みられない状況で、今後も改善されない可能性は大だと思われます。

なお、piCalモジュールでは、この悪しき仕様に対抗して、強制的にrestore_error_handler()を実行し、なるべく XoopsErrorHandlerに処理が渡らないようにしていますが、そういうゲリラ的な対抗策が意味を持つかどうかは難しいところです。

MySQL/Blocksデバグ

一般設定→一般設定 において、「MySQL/Blocksデバグ」をONとすると、ページが表示される度に(管理画面でも)ポップアップウインドウが開き、以下の情報が表示されます。

  • 発行されたデータベースクエリ(SQL文)の一覧
  • ブロックのキャッシュ状態
  • スクリプトの実行時間
  • その他、モジュールなどによる明示的なLoggerへの出力内容

ポップアップウインドウが開かない場合、ブラウザのポップアップブロックが機能していないか、確認してください。また、「MySQL/Blocksデバグ」がONであっても、管理者以外にはポップアップウインドウは表示されません。

上に挙げた4つの項目のうち、読むべき価値があるとすれば、唯一一番上のクエリ一覧でしょう。もし、モジュールの動作がおかしいのに、PHPデバグでは特 に何も表示されない場合、クエリ一覧に赤字の行があるかどうかをチェックするのも良いでしょう。もし、赤字となっているクエリ(クエリとしてエラーになっ ている)があれば、それをモジュール作者に伝えることで、よりトラブルシュートしやすくなります。

Smartyデバグ

一般設定→一般設定 において、「Smartyデバグ」をONとすると、ページが表示される度(通常は、公開サイト側のみ)にポップアップウインドウが開くようになります。

画面上部には、Smartyで利用されたテンプレートの依存状況および、テンプレートのロード時間が表示されます。便利かも知れません。

画面下部には、Smartyにアサインされた変数名とその中身の対応が表示されます。
ただし、テンプレート毎のアサイン変数が判るわけでもなく、かなり中途半端な実装になっています。

テーマやテンプレートの開発であるなら、altsysモジュールを利用するのが良いでしょう。

*1 実際には、大手の共用ホスティングサービスでは、URIからフルパスを想像することが容易であるケースも多く、物理パスが判ったからといって即攻撃につなげられるわけもなく、大騒ぎするほどの問題・脆弱性ではありません
*2 実際には、display_errorsそのものはいじっていないのですが、2.0.4以降に導入されてしまった ErrorHandlerという誤った実装のクラスを利用しているために、運用中のサーバでdisplay_errors offとしてても、画面出力されてしまいます。これは明らかに要修正でしょう


Previous
9.2 データの移動について
Top of contents
Back to Page Top
MainMenu
Manuals
Search
XOOPS Official & Dev.
XOOPS Communities