Forked from sh41/01 Create a debug version of the docker image.sh
Last active
May 15, 2020 19:50
-
-
Save bpteam/8d1cbd256de9f32744191499d91bf0d0 to your computer and use it in GitHub Desktop.
Debugging segmentation faults in PHP in a docker container.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
git clone https://github.com/docker-library/php.git docker-library-php | |
## Go to the specific version you're interested in | |
cd docker-library-php/7.4/fpm/alpine | |
## Edit the .Dockerfile. | |
## Change | |
## ENV PHP_EXTRA_CONFIGURE_ARGS --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data | |
## to | |
## ENV PHP_EXTRA_CONFIGURE_ARGS --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --enable-debug | |
## Comment out or delete: | |
## && { find /usr/local/bin /usr/local/sbin -type f -perm +0111 -exec strip --strip-all '{}' + || true; } \ | |
## && docker-php-source delete \ | |
## Now build the container with a tag that make sense. | |
docker build -t php:7.4-alpine-debug | |
## now use this newly built container in place of the non-debug one. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## Set the location of the core dump to /tmp | |
## On linux host | |
echo "/tmp/core-%e.%p" > /proc/sys/kernel/core_pattern | |
## On Docker for Windows this requires a bit of a dodgy hack on the MobyVM | |
## Get a privliged prompt in a container (but accessing the host) | |
docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine sh | |
echo "/tmp/core-%e.%p" > /proc/sys/kernel/core_pattern | |
exit | |
## For CLI segfaults get a shell in the container | |
## Compose | |
## docker-compose exec php-fpm sh | |
## Standalone | |
docker run php:7.4-alpine-debug sh | |
## Set core size as per https://bugs.php.net/bugs-generating-backtrace.php | |
ulimit -c unlimited | |
## check that the container has correct core location | |
cat /proc/sys/kernel/core_pattern | |
## /tmp/core-%e.%p | |
## Check that PHP has symbols (look for "not stripped" in the following: | |
file `which php` | |
#/usr/local/bin/php: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, not stripped | |
## Install gdb (example for alpine other distros differ | |
apk add --no-cache gdb | |
## Run the seg faulting program | |
/usr/local/bin/php somedyingfile.php | |
## find the core | |
ls -lrt /tmp/core-php* | |
## Do some debugging | |
gdb /usr/local/bin/php /tmp/core-php.123 | |
## in gdb import php helper macros | |
(gdb) source /usr/src/php/.gdbinit | |
## use zbacktrace to get a sensible backtrace | |
(gdb) zbacktrace | |
[0x7f7af1815ff0] Symfony\Component\VarDumper\Cloner\VarCloner->doClone(array(7)[0x7f7af1816040]) /var/www/html/vendor/symfony/symfony/src/Symfony/Component/VarDumper/Cloner/VarCloner.php:123 | |
[0x7f7af1815f50] Symfony\Component\VarDumper\Cloner\AbstractCloner->cloneVar(array(7)[0x7f7af1815fa0]) /var/www/html/vendor/symfony/symfony/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php:213 | |
[0x7f7af1815ed0] Symfony\Component\HttpKernel\DataCollector\DataCollector->cloneVar(array(7)[0x7f7af1815f20]) /var/www/html/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/DataCollector/DataCollector.php:81 | |
...etc. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment