CGI::Carpのソースを読んだ。グローバル変数に設定を持っていた。そもそもuse strictしてなかった。
mod_perl下でとある一つのスクリプトが、そんなモジュールのwarningsToBrowserを使ったせいで、サーバ上のスクリプトが一気に全部デバグモードになった。サイト全部にデバグコードが出現。恐ろしい・・・。
このモジュールは$CGI::Carp::WARNと$CGI::Carp::EMIT_WARNINGSが強調してエラーを吐く仕組みになっていて、前者はuseのタイミングで、後者はwarningsToBrowser(1)のタイミングでONになる。前者がONになるとwarningのキャッシュを始め、後者がONになった時点でwarningをコメントに吐き始める。
useした時点では$CGI::Carp::EMIT_WARNINGSがOFFのはずなのだが、最初に書いたようにこいつはグローバルなので、一度ONになると他のプロセス上でも常にONの状態を保ってしまう。
今回自分が体験した例では、実はwarningsToBrowser(1)は呼んで居なかったのだが、dieのタイミングでも$CGI::Carp::EMIT_WARNINGSを1にするコードが入っているので、一度でもdieをしたことがあるmod_perlのプロセスだけがデバグ状態になっているというわかりにくい状態になっていた。