2010-12-10 39 views
0

HI,Segmentation fault mod_perl

Je suis en cours d'exécution d'un apache 2.2.3 sur un Oracle64 bits (clone Red Hat) et je suis frappé un mur de briques avec un problème. J'ai un programme qui utilise MIME :: Lite pour envoyer du courrier via sendmail (je m'excuse, je ne sais pas quelles versions de sendmail ou mod_perl je cours, bien que je pense que la partie sendmail n'est pas pertinente comme vous le verrez dans un instant)

à l'occasion, apache segfault (11), et creuser profondément dans le MIME :: Lite le module, je vois qu'il est sur la ligne suivante:

open SENDMAIL, "|$sendmailcmd" or Carp::croak "open |$sendmailcmd: $!\n"; (this is in MIME::Lite) 

maintenant, on pourrait sendmail automatiquement suspect, mais si je faisais la même ligne à utiliser/bin/cat (comme indiqué):

open SENDMAIL, "|/bin/cat" 

apache encore segfaults.

Je joint un strace aux processus apache et voir ce qui suit: (quand il ne tombe pas en panne)

12907 write(2, "SENDMAIL send_by_sendmail 1\n", 28) = 28 
12907 write(2, "SENDMAIL /usr/lib/sendmail -t -o"..., 40) = 40 
12907 pipe([24, 26])     = 0 
12907 pipe([28, 29])     = 0 
12907 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,  child_tidptr=0x2b4bcbbd75d0) = 13186 

Notez le « sendmail sent_by_sendmail » sont mes commentaires. Vous pouvez voir clairement l'ouverture des tuyaux. Quand il se bloque, vous verrez ce qui suit:

10805 write(2, "SENDMAIL send_by_sendmail (for y"..., 40) = 40 
10805 --- SIGSEGV (Segmentation fault) @ 0 (0) --- 

Maintenant, remarquez qu'il ne conduit jamais. J'ai essayé GDB et ça ne m'a vraiment rien montré.

Enfin, je l'ai écrit un programme simple à exécuter par mod_perl et cgi régulière:

print header(); 
print "test"; 

open SENDMAIL, "|/bin/cat" or Carp::croak "open |sendmailcmd: $!\n"; 
print SENDMAIL "foodaddy"; 
close SENDMAIL; 
print "test done <br/>"; 

Sous mod_perl, il est tombé en panne avec succès. Mon analyse me dit que c'est en essayant d'ouvrir un descripteur de fichier, la fonction de piping retourne false ou un handle de fichier corrompu.

J'ai également augmenté la limite du descripteur de fichier à 2048, pas de dés.

Est-ce que quelqu'un a des idées sur où je devrais regarder? Des pensées?

J'apprécie l'aide

Répondre

0

Je viens de passer beaucoup de temps traquer un problème qui a commencé avec des symptômes identiques. J'ai finalement découvert que Test :: More ne joue pas bien avec mod_perl. Retrait de ce module de mon code semble avoir résolu le problème (jusqu'à présent!). Je n'ai pas suivi cela plus profondément, mais je soupçonne que le problème réside réellement dans Test :: Builder.