前回に引き続きWin32版Apache関係のネタを書いていきます。
ローカルにWin32版Apacheを用いたWebアプリケーション開発環境を構築した場合のメリットのひとつとして、ビルド・デバッグの手軽さという要素があるかと思います。
今回はローカル環境でそのような作業を行う場合に、役に立つかもしれないTipsを紹介しようと思います。
ファイルの配置ミスだったり、ファイル名のtypoだったり、Perlのモジュール不足だったり・・・ちょっとしたミスで期待した出力を得ることができない状況というのはよく発生することだと思います。
・・・よく発生するのは私だけかもしれません(笑)
このような状況に陥った場合には、まず最初にApacheのエラーログを見ることになると思いますが、事あるごとにテキストエディタでエラーログを開いて・・・という作業は結構かったるいものです。
私は一時期Apacheのログの最終行を表示するショートカットを作っていたりしました。
Windowsアプリケーションの開発者にはおなじみかもしれませんが、WindowsのAPIにOutputDebugStringというAPIがあります。
これは開発ツールが持つデバッガにデバッグ出力を行うためのものですが、開発ツールをインストールしなくとも、この出力を表示するDebugViewというツールがSysinternalsより公開されています(現在はMicrosoftが配布しています)
今回このツールを活用して、Win32版Apacheのエラーログをすばやく参照できるデバッグ補助環境を作りたいと思います。
- DebugViewをインストールする
-
まず最初にDebugViewのインストールを行います。
DebugView for Windows
ページ右側にあるダウンロードリンク(Download DebugView)からファイル DebugView.zip をダウンロードし、適切なフォルダへ展開してください。
DebugViewのインストールはこれで完了です。
- mod_win32dstrをインストールする
-
ここで今回作成した小さなApacheモジュールmod_win32dstrをインストールします。
このモジュールはApacheのエラーログ出力をデバッガにも出力する機能を追加します。ダウンロード: mod_win32dstr.zip
ライセンス: Apache 2.0zipアーカイブに含まれるファイルmod_win32dstr.soがApache2.2向けにビルドされたモジュールです。このファイルをApacheのmodulesフォルダに移動します。
ソースコードも同梱していますので、Apacheのビルド環境があれば、ビルド・改変等も可能です。次にhttpd.confを開き、
LoadModule win32dstr_module modules/mod_win32dstr.so
<IfModule mod_win32dstr.c>
EnableWin32DStr On
</IfModule>この4行を追加します。
これでmod_win32dstrのインストールは完了です。
- DebugViewを使う
-
さきほどインストールしたDebugViewを起動してからApacheを起動します。
DebugViewの画面にApache起動のログが流れてくれば成功です。
これでリアルタイムにApacheのエラーログを参照できる環境ができました。
あとはエラーログを見ながら作業したいときにDebugViewを起動しておくようにします。
ただし、このデバック出力は、ほかのアプリケーションも利用していますので、環境によっては、いろんなメッセージが流れていきますので注意しましょう。DebugViewを他の用途に用いたいときは、httpd.confに追加したEnableWin32DStrディレクティブの値をOffにすることでエラーログの出力が行われなくなります。
- 応用
-
Webアプリケーションの開発では、標準エラー出力に出したものはApacheのエラーログに流れますので、これを利用して簡単にデバッグメッセージを出すことができます。
しかし、PerlにはWin32-API-OutputDebugStringというその名の通りのモジュールがあり、エラーログを経由しなくとも自由にデバッグメッセージの出力を行うことが可能です。
ActivePerlではppmを用いて容易にインストールできます。ppm install Win32-API-OutputDebugString
このモジュールを使えばPerlのコードから簡単にデバッグメッセージを出力することができるようになります。私の環境ではMTプラグインの開発・デバッグ時に活躍しています。
MTでは警告メッセージの出力がフックされていますので、これをフックしないようにする、もしくはフックにあわせてデバッグ出力を行うようにする・・・などの作業を行うとよりよい情報が得られるようになります。
MT向けの部分についてはまた機会をみて書いていきたいと思います。