2016-09-16 2 views
0

Я получаю пустую страницу и новую запись в dmesg для каждого отдельного запроса.Как понять ошибки php из 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, он работает нормально (я тестировал файл и массив => без кэширования). Но поскольку я хочу memcached, мне интересно, как я могу продолжить исследование?

ответ

2

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

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

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

как я могу исследовать дальше?

Для этого необходимо установить отладочные символы для этой сборки php.

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

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

После того, как вы знаете функцию, вы можете Google для решения или известной ошибкой.

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

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

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

Смежные вопросы