Windows XP + Apache 1.3.X + mod_perl 1.X + Helios + EPIC でデバッグできませんでしたー!
こんな話で申し訳ないですが、「こうすればこれができる!」って話ではなく、「これやってみたけどできませんでした」という話です。
具体的には、ここの記事を Apache 1.3 系と mod_perl 1 系でもできるかやってみたけど、できなかったという話です。
Debugging mod_perl with EPIC | plosquare.com blog
失敗の詳細
使用したバージョンはこんな感じです。
- Windows XP SP3 ほぼ最新
- Apache 1.3.41
- 今さらですができるだけパスが短くて空白が入らない場所に入れるべきでした…
- ActivePerl 5.8.9
- mod_perl たしか 1.29
- インストールは ppm install http://theoryx5.uwinnipeg.ca/ppms/mod_perl-1.ppd
- Helios 3.6.2
- EPIC 0.6.39
- PadWalker 1.92
- Apache::DB 0.14
Apache 1.3 系に対応するため、上記サイトの以下の部分は次のように変更しました。
- ModPerl::Registry → Apache::Registry
- use APR::Pool (); のコメントアウト
そして説明通りに URL を叩くとデバッガがスタートして、Apache::Registry のどこかで止まってくれるのですが、自分のCGIスクリプトに置いたブレークポイント ($DB::single = 1;) にはついぞ止まってくれませんでした。
ちなみに Apache::Registry を Apache::PerlRun にしてみたり、ModPerl::Registry にしてもみましたが、前者はブレークポイント無視、後者はエラーが起きました(まあ当たり前ですが…)
Apache 2.2 と mod_perl 2 ならできるんだよね?
やってみたらできました。上記のサイトの通りにやるのが肝心です。
ModPerl::Registry をステップ実行できますが、 Apache::Registry とは中身が全く違っていました。
ちなみに変数ビューにはグローバル変数やらは表示されないみたいです。
my $var = "aaa"; とかならちゃんと変数ビューに表示されます。
もう1つ、Apache をデバッグモード*1で起動しないとだめなのですが、これはコマンドプロンプトからでないと無理っぽいです。コマンドプロンプトから以下のようにして起動します。 "Apache2.2" ってのはデフォルトの名前なんで変更してると違う可能性があります。
httpd.exe -n "Apache2.2" -X
で、Apache 1.3 系 mod_perl 1 ではどうすればいいの結局
上記は Perl リモートデバッグですが、Perl CGI の方でデバッグするしかないようです。
ここでも色々罠があるのですが、とりあえず以下を参考にしました。
このうち C:/Perl/lib をインクルードパスに追加、 引数に -Mepic_breakpoints さえやっておけばブレークポイントで止まったと思います。
プロジェクト外のライブラリで止めたいときは、いつの間にかナビゲーターに表示されている epic_links の中から探すとよさげです。ちゃんと止まります。
しかしなんで今さら Apache 1.3 なんでしょうね。俺もそう思います。
まあそれは今度書くかもしれません。
*1:"-X" というオプションはヘルプになぜか出てきません。ので最初使えないのかと勘違いしてしまいました。要注意。