重要なアップデート:この問題は、Apacheまたはmod_perlとは関係ありません。 最も簡単なデモンストレーション:実際binmode
でbinmode + mod_perl 2.0.5 + Parse :: RecDescent = segmentaion fault
> perl -le 'use PerlIO::via::QuotedPrint; binmode(\*STDERR, ":via(PerlIO::via::QuotedPrint):utf8"); open (ERROR, ">&STDERR");'
zsh: segmentation fault perl -le
を解析:: RecDescentのことで私のコードとopen (ERROR, ">&STDERR");
によって行われます。
オリジナル質問:
は私が2.0.5 Apacheがセグメンテーションフォールトで死ぬmod_perlの下で、スプレッドシート:: WriteExcelに問題がある、と私はそれがSpreadsheet::WriteExcel
パッケージ内require Parse::RecDescent
声明に発生することが分かりました。
straceの問題が発生した最後のものはdup'ing STDERRであることを示しています。私はParse::RecDescent
のコードを読んで、open (ERROR, ">&STDERR");
まあのようなステートメントを気づい
[pid 31253] dup(2) = 8
[pid 31253] ioctl(8, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffcf66a328) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 31253] lseek(8, 0, SEEK_CUR) = 0
[pid 31253] --- SIGSEGV (Segmentation fault) @ 0 (0) ---
は、いくつかの追加の実験の後、私はこのミニマルを持っていますセグメンテーションを再現するためのアプリを作る:
use strict;
use warnings;
# DANGEROUS
use PerlIO::via::QuotedPrint;
binmode(\*STDERR, ":via(PerlIO::via::QuotedPrint):utf8");
my $app = sub {
my $env = shift;
open (ERROR, ">&STDERR"); # segmenatation fault
return [
'200',
[ 'Content-Type' => 'text/plain' ],
[ "hello world" ],
];
};
$app;
(実際には以外のbinmodeレイヤーを使用していますでも効果は同じです)
私がbinmode(\*STDERR, ":via(PerlIO...
を実行しないと、Apacheはセグメンテーションしません。
私がSTDERR
を複製していない場合、Apacheはセグメンテーションしません。
私がその両方を行うと、それはセグメンテーションします。
STDERRでbinmode
を使用することは避けることができますが、それは良くありません。
これをどこでどのように修正するべきですか?
ありがとうございました。
私の環境:
perl -v |grep version
This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi
uname -a
Linux thinkpad 3.2.0-32-generiC#51-Ubuntu SMP Wed Sep 26 21:33:09 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
lsb_release -c
Codename: precise
dpkg -l |grep mod-perl
ii libapache2-mod-perl2 2.0.5-5ubuntu1 Integration of perl with the Apache2 web server
UPD:FreeBSDの9.1 + perlの5.14 + mod_perlの2.0:同じコードが時代遅れのUbuntu 8.04 + perlの5.8.8 + mod_perl2 2.0.3
UPD2の下でうまく動作します。 8 - セグメンテーション違反それはbinmode
セットせずに動作する場合は、おそらくあなたはソリューション(ない場合はこれが起こっている理由に本当の答えを)持っている
uname -a
FreeBSD liruoko.ru 9.1-RELEASE-p5 FreeBSD 9.1-RELEASE-p5 #7 r253740: Sun Jul 28 16:53:08 MSK 2013 [email protected]:/usr/obj/usr/src/sys/MINI amd64
pkg info |grep apache
apache22-itk-mpm-2.2.25 Version 2.2.x of Apache web server with itk MPM.
pkg info |grep mod_perl
ap22-mod_perl2-2.0.8,3 Embeds a Perl interpreter in the Apache2 server
perl -v |grep version
This is perl 5, version 14, subversion 4 (v5.14.4) built for amd64-freebsd
詳細情報を入力してください。オペレーティングシステム、Perlのディストリビューションとバージョンは何ですか?ソフトウェアが古くなった場合は、アップグレードするとどうなりますか? – daxim
Ubuntu 12.04(LTS)、perl 5.14、詳細な質問が – Hln
に追加されました。それ以来、Perlとmod_perlの両方には数多くのクラッシュバグを修正したリリースがありました。 mod_perl 2.0.8とperl 5.18.1でクラッシュがまだ発生していますか?はいの場合は、http://perl.apache.org/docs/2.0/devel/debug/c.html#Analyzing_Dumped_Core_Filesを参照してください。 – daxim