1

説明するのにかなり複雑な問題があります。さらにデバッグするための提案を探しています。

通常のcgiからmod_perlに変換しようとしています。ページを読み込むスクリプトにhttpリクエストを送信すると、そのページに、別のスクリプトを介して取得される画像を読み込むためのリンクがあります(つまり、画像は単なるリンクではなく、cgiスクリプトを介して読み込まれます) 。そのため、ページがブラウザに読み込まれると、ブラウザは、画像を読み込むためのスクリプトを実行するリクエストをさらに6つ開始します。

最初のスクリプト(初期ページロード)は正常に実行されますが、その後、イメージロードスクリプトを処理するときに、Apacheサーバーがタイトループ(CPU使用率が非常に高く、強制終了する必要があります)になります。画像読み込みスクリプトの1つが正常に実行される場合もありますが、さらに1つがループする場合もあります。また、ループする最初の画像読み込みスクリプトである場合もあります。straceはループ中に何も表示しません。

シングルユーザーモード(-Xを使用)でApacheサーバーを起動し、トレースをオンにしてインタラクティブなPerlデバッガーを実行し、ループがどこから始まるかを確認しました。私はこれを数回行いましたが、「use」ステートメントの処理中に、まったく同じ場所で開始するたびに実行しました。「use」と「require」のステートメントの山と山が、他のがらくたと一緒に通過しているのがわかりますが、それは常に次の場所で停止します。

Params::Classify::CODE(0x7f43b0b46dd8)(/usr/lib/perl5/Params/Classify.pm:97):
97:     eval { local $SIG{__DIE__};
Params::Classify::CODE(0x7f43b0b46dd8)(/usr/lib/perl5/Params/Classify.pm:97):
97:     eval { local $SIG{__DIE__};
Params::Classify::CODE(0x7f43b0b46dd8)(/usr/lib/perl5/Params/Classify.pm:98):
98:             require XSLoader;
Params::Classify::CODE(0x7f43b0b46dd8)(/usr/lib/perl5/Params/Classify.pm:99):
99:             XSLoader::load(__PACKAGE__, $VERSION);
Params::Classify::CODE(0x7f43b0b46dd8)(/usr/lib/perl5/Params/Classify.pm:102):
102:    if($@ eq "") {
Params::Classify::CODE(0x7f43b0b46dd8)(/usr/lib/perl5/Params/Classify.pm:103):
103:            close(DATA);
Params::Classify::CODE(0x7f43b0b46dd8)(/usr/lib/perl5/Params/Classify.pm:130):
130:    1;
Data::Entropy::CODE(0x7f43b0b46dd8)(/usr/share/perl5/Data/Entropy.pm:46):
46:     use Params::Classify 0.000 qw(is_ref);
Data::Entropy::CODE(0x7f43b0b46dd8)(/usr/share/perl5/Data/Entropy.pm:46):
46:     use Params::Classify 0.000 qw(is_ref);

'use'処理のこのセクションは、私のスクリプトで次のように開始されます。

use Authen::Passphrase::BlowfishCrypt;

Data::EntropyとParams::Classifyを検索しましたが、有用なものは見つかりませんでした(これは私が期待していたことですが、バグがあるとは思えません)。

これは、以前のスクリプト実行によるメモリの破損の感覚がありますが、それを追跡する方法はまだわかりません。私はmod_perlを初めて使用するので、何人かの専門家がそれを実行して、似たようなものに遭遇したかどうか、またはこれをさらにデバッグする方法について提案があるかどうかを確認すると思いました。

apache / 2.2.22 mod_perl / 2.0.5 perl/5.14.2を実行しています。

コードはかなり基本的ですが、ここにあります:

package Wii::Web;

use strict;
use warnings;

use base qw(Wii);

use Data::Dumper;
use Params::Validate qw(:all);
use Log::Log4perl qw(get_logger :easy);
use CGI;
use Carp qw(cluck);
use Email::Valid;
use Authen::Passphrase::BlowfishCrypt;
use Digest::SHA;
use Digest::HMAC;
use Time::HiRes qw(gettimeofday tv_interval);
use Wii::Web::View;
use Wii::Web::Register;
use Wii::Web::Login;
use Wii::Web::Session;
use Wii::Web::User;
use Wii::Web::Found;

$CGI::POST_MAX = 1024 * 5000;

BEGIN {
  $SIG{__DIE__} = \&sigDie;
}

sub sigDie {
  return if $^S; # we are in an eval block

  # assume this is the first print
  my ($error) = @_;
  print "Status: 500\n";
  print "Content-type: text/html\n\n";
  print "<html><body>\n";
  print "<h3>Whoops there was an error!</h3>\n";
  print "<!-- $error  -->\n";
  print "Please try again later<br />\n";
  print "<b>$error</b>\n";
  print "</body></html>\n";

  Wii::sigDie(@_);

  return 1;
}
<snip>

このモジュールの前に関係する他のモジュールがありますが、これが問題を開始するモジュールです。

4

1 に答える 1

2

Params::Classify::XS はスレッドセーフではありません。XS から perl Perl バージョンの使用に切り替えます。

于 2012-10-24T17:58:15.030 に答える