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/