Re: How to debug a segmentation fault?
| From: | tyson andre | Date: | Tue, 28 Jan 2020 17:14:57 +0000 |
| Subject: | Re: How to debug a segmentation fault? | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-108297@lists.php.net to get a copy of this message | ||
> I'm encountering a SIGSEGV in PHP-FPM on PHP 7.4.2 in a Symfony app. The
> bug seems to happen during the rendering of a Twig template; this makes it
> hard for me to pinpoint the code that triggers the segfault.
>
> Could you please tell me what the procedure to collect information is, so
> that I can file a useful bug report?
I'm not sure if there are official recommendations, but what I've done before for httpd:
1. Do you have a line in your syslogs (e.g. /var/log/messages or elsewhere for ip (instruction
pointer) segfaulted in libphp7.so or elsewhere, etc. If you run objdump --disassemble-all on the
shared library where the crash occurs, you might know slightly more, but not very much, and would
want to generate a core dump instead.
For something like "segfault at ffffffff00000008 ip 00007f2ca2ef7121 sp 00007ffeef578850
error 5 in libphp7.so[7f2ca2a83000+b95000]", it'd have crashed at the instruction on
0x00007f2ca2ef7121 - 0x7f2ca2a83000 in libphp7.so
2. I haven't tried these instructions before, but you probably want to enable core dumps. https://ma.ttias.be/generate-php-core-dumps-segfaults-php-fpm/
(first google result) may help.
Then, you can run 'gdb /usr/local/php/modules/libphp7.so /tmp/coredumpxxx' to see the
stack trace where the dump occurred to include it, and include it in a bug report. (the path or
shared library you want may differ)
If you can install debugging symbols (I'm not sure what the package is called - something
like php-debuginfo or running debuginfo-install ....?), or build php with --enable-debug and
reproduce the crash, that would also help.
Make sure to turn off core dumps and restart php-fpm when you're done.
Using a build of php configured with --enable-debug would also tell you if a ZEND_ASSERT failed
before the segmentation fault (I think, I forget how it works with fpm)