Я получаю пустую страницу и новую запись в 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, мне интересно, как я могу продолжить расследование?
Как понять ошибки 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
код и т. д. Если вы этого не знаете, вам придется привлечь кого-то, кто знает.
Других решений пока нет …