PHP-FPM Core Dumps – Kurzanleitung

Veröffentlichung 28. August 2018 @ 19:33
Letzte Änderung 20. April 2021 @ 12:52

Übersicht

  • Erzeugen von Core Dumps für PHP-FPM

Voraussetzungen

Software

  • GNU Project Debugger GDB 7.11.1 #gdb –-version
  • PHP 7.0.30 #php –version
  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Ordner und Dateien

  • Core Dumps /tmp/core-php-fpm7.0-*
  • Konfiguration /etc/default/apport, /etc/init.d/apport, /etc/php/7.0/fpm/pool.d/example.conf, /etc/sysctl.conf, /proc/sys/fs/suid_dumpable, /proc/sys/kernel/core_pattern

GNU Project Debugger GDB installieren

apt install gdb

Apport deaktivieren

Konfigurationsdatei für Apport-SysVinit-Skript /etc/init.d/apport anpassen

...
#Apport deaktivieren
#enabled=1
enabled=0

System neustarten

shutdown -r now

Core Dumps von Programmen mit gesetztem SUID-/SGID-Bit zulassen

Kernel-Parameter dauerhaft bei jedem Systemstart ergänzen und Änderungen sofort laden

...
#auch Core Dumps von Programmen mit gesetztem SUID-/SGID-Bit erzeugen,
#dabei nur Benutzer root Zugriff auf Core-Dump-Dateien erlauben:
fs.suid_dumpable=2
sysctl --load=/etc/sysctl.conf

[Optional] Kernel-Parameter temporär bis zum nächsten Neustart ändern

echo "2" > /proc/sys/fs/suid_dumpable

PHP-FPM neustarten

systemctl restart php7.0-fpm

Aufbau der Core-Dump-Dateinamen festlegen

Format core-Programm-Hostname-PID-UID-GID-Zeitstempel

Kernel-Parameter dauerhaft bei jedem Systemstart ergänzen und Änderungen sofort laden

...
#Aufbau der Core-Dump-Dateinamen festlegen:
kernel.core_pattern=/tmp/core-%e-%h-%p-%u-%g-%t

[Optional] Kernel-Parameter temporär bis zum nächsten Neustart ändern

echo "/tmp/core-%e-%h-%p-%u-%g-%t" > /proc/sys/kernel/core_pattern

Größenbegrenzung für Core Dumps für Pool example aufheben

FPM-Pool-Konfigurationdatei ergänzen

...
;Größenbegrenzung für Core Dumps aufheben
rlimit_core = unlimited

PHP-FPM neuladen

systemctl reload php7.0-fpm

[Optional] Core Dump erzeugen

(Beliebige) ID für Prozess für Pool example finden

ps -ef | grep 'php-fpm: pool example'
...
www-data <PID> xxx 0 xx:xx ? xx:xx:xx php-fpm: pool example
...

Prozess mit Signal für Segmentation Fault beenden und dadurch Core-Dump-Datei erzeugen

kill -s SIGSEGV <PID>

Core Dump analysieren

gdb /usr/sbin/php-fpm7.0 /tmp/core-php-fpm7.0-xxx-<PID>-xxx-xxx-xxx
...
(gdb) bt full
...

Aufhebung der Größenbegrenzung für Core Dumps für Pool rückgängig machen

FPM-Pool-Konfigurationdatei anpassen

...
;rlimit_core = unlimited

PHP-FPM neuladen

systemctl reload php7.0-fpm

[Optional] Core-Dump-Dateien löschen

rm /tmp/core-*

Quellen

http://manpages.ubuntu.com/manpages/xenial/man1/kill.1.html
http://manpages.ubuntu.com/manpages/xenial/man1/gdb.1.html
http://manpages.ubuntu.com/manpages/xenial/man5/core.5.html
http://manpages.ubuntu.com/manpages/xenial/man5/sysctl.conf.5.html
http://manpages.ubuntu.com/manpages/xenial/man7/signal.7.html
http://manpages.ubuntu.com/manpages/xenial/man8/sysctl.8.html
https://secure.php.net/manual/de/install.fpm.configuration.php
https://wiki.ubuntuusers.de/Apport/