Comment obtenir un vidage de mémoire d'Apache lors d'une erreur de segmentation

13

J'ai suivi des instructions de nombreux endroits en ligne sur la façon d'obtenir un vidage de mémoire d'Apache lorsqu'il produit un défaut de segmentation, mais il refuse toujours de générer le vidage.

J'ai:

  1. Ajout de la CoreDumpDirectorydirective dans le httpd.conffichier et définissez-la sur/tmp
  2. Réalisé ulimit -c unlimited
  3. A fourni le modèle pour les vidages en utilisant echo '/tmp/core-%e.%p' > /proc/sys/kernel/core_pattern
  4. Aussi couru echo 0 > /proc/sys/kernel/core_uses_pid

Httpd a été redémarré, mais toujours aucun vidage créé.

J'utilise CentOS 5.8 x64 avec httpd-2.2.3-65.el5.centos.3etphp-5.3.20-13.el5.art

Toute aide serait très appréciée!

chrismcb
la source
Apache a-t-il la permission d'écrire dans le fichier que vous avez spécifié dans la directive CoreDumpDirectory? Il devrait appartenir à apache.
Valentin Bajrami
Je l'ai défini sur / tmp qui est accessible en écriture, mais je vais essayer ailleurs et lui donner la propriété d'apache
chrismcb
Merci - cela a produit un vidage, mais pas à l'endroit où je l'ai placé! Je mis le CoreDumpDirectoryà /tmp/dumpset largué à /tmp... maintenant avec le débogage
chrismcb
Je suis content que vous l'aillez compris!
Valentin Bajrami

Réponses:

7

Ma réponse est la suivante:

  1. Configurez la directive comme suit

    CoreDumpDirectory /tmp/mycoredump

  2. Créez le répertoire:

    mkdir -p /tmp/mycoredump

  3. Attribuer la propriété au répertoire www-data ou httpd

    chown -R www-data:www-data /tmp/mycoredump

  4. Définissez les autorisations sur:

    chmod 777 /tmp/mycoredump

  5. Redémarrez Apache:

    service apache2 restart

Valentin Bajrami
la source
Oui, je l'ai fait à peu près, mais ça a fini par se déverser de /tmptoute façon!
chrismcb
6
Ce n'est jamais une bonne idée de chmod 777quoi que ce soit
sendmoreinfo
1
@sendmoreinfo Mais que se passe-t-il si votre cas d'utilisation crée quelque chose de entièrement modifiable et exécutable pour le monde extérieur? ;-)
avgvstvs
8
Vous êtes autorisé à vous tirer une balle dans le pied, ne prêchez pas cela.
sendmoreinfo
0

Notez que si vous avez PrivateTmp=truedéfini votre /usr/lib/systemd/system/apache2.service(ou quel que soit son nom sur votre système), ce qui signifie qu'Apache recherche réellement à l' /tmpintérieur de quelque chose comme /tmp/systemd-private-c27fc5b152d546159d675e170641529b-apache2.service-IcEt0m/, Apache ne pourra pas écrire dans ce répertoire et vous ne recevrez pas de cœurs du tout (en raison dans le systemdrépertoire tmp ayant 700 perms root uniquement).

La solution consiste à définir PrivateTmp=falseou à modifier l'autorisation du répertoire systemd tmp après le démarrage du serveur.

J'ai perdu des heures là-dessus pour me rendre compte à peine du problème.

Artem Russakovskii
la source