ошибка сегментации — Как понять ошибки php из dmesg

Я получаю пустую страницу и новую запись в dmesg для каждого отдельного запроса.

php[41369] general protection ip:5c0cc3 sp:7fff281f0d98 error:0 in php[400000+33c000]
php[41399] general protection ip:5c0cc3 sp:7fffad17fd68 error:0 in php[400000+33c000]
php[41408] general protection ip:5c0cc3 sp:7fff84481ce8 error:0 in php[400000+33c000]
php[41412] general protection ip:5c0cc3 sp:7fff56af32f8 error:0 in php[400000+33c000]
php[41417] general protection ip:5c0cc3 sp:7fff1e4d1ca8 error:0 in php[400000+33c000]
php[41426] general protection ip:5c0cc3 sp:7fff87a67108 error:0 in php[400000+33c000]
php[41431] general protection ip:5c0cc3 sp:7fffb16bacc8 error:0 in php[400000+33c000]
php[41437] general protection ip:5c0cc3 sp:7fffbc41d5c8 error:0 in php[400000+33c000]

Я уже обнаружил, что это вызвано php-memcache. При переключении моего драйвера для кэширования на что-либо, кроме memcached, он, кажется, работает правильно (я протестировал file и array => no caching). Но так как я хочу memcached, мне интересно, как я могу продолжить расследование?

0

Решение

Как понять ошибки php от dmesg

Это довольно просто: это говорит вам, что php двоичный файл был отображен в диапазоне адресов [0x400000, 0x400000+33c000) (нормально для x86_64 двоичные файлы в Linux), и это различные процессы (pid 41369, 41399и т. д.) разбился с регистра rip (он же счетчик программ) установлен в 0x5c0cc3и зарегистрируйтесь rsp (он же указатель стека) устанавливается в различные значения (стек рандомизирован в Linux).

Так как все rip значения одинаковы, сбой происходит в одном и том же месте во всех случаях.

как я могу продолжить расследование?

Вам нужно установить символы отладки для этого php строить.

После этого вы можете сначала определить, в какой функции происходит сбой, например:

gdb /path/to/php
(gdb) x/i 0x5c0cc3   # GDB will tell you instruction and function

Как только вы узнаете функцию, вы сможете найти решение или известную ошибку.

Вы также можете прикрепить GDB к работающему php обработать, а затем выдать запрос. Если твой php теперь вы сможете увидеть стек вызовов, который приводит к (gdb) where команда.

Помимо этого, вы можете построить php пакеты из исходного кода с отключенной оптимизацией и отладкой исходного кода.

Все это предполагает, что вы знаете, как компилировать пакеты, как отлаживать C код и т. д. Если вы этого не знаете, вам придется привлечь кого-то, кто знает.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]