如何理解来自 dmesg 的 php 错误

How to understand php errors from 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 之外的任何东西时,它似乎工作正常(我已经测试了文件和数组 => 无缓存)。但是因为我想要 memcached,所以我想知道如何进一步调查?

How to understand php errors from dmesg

非常简单:它告诉您 php 二进制文件被映射到地址范围 [0x400000, 0x400000+33c000)(对于 Linux 上的 x86_64 二进制文件是正常的),并且各种进程(pid 4136941399 等)因寄存器 rip(又名程序计数器)设置为 0x5c0cc3 和寄存器 rsp(又名堆栈指针)而崩溃设置为各种值(堆栈在 Linux 上随机化)。

由于所有 rip 值都相同,因此所有实例中的崩溃都发生在完全相同的位置。

how can I investigate further?

您需要为此 php 版本安装调试符号。

完成后,您可以先确定崩溃发生在哪个函数中,如下所示:

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

了解函数后,您可以google 寻找解决方案或已知错误。

您还可以将 GDB 附加到 运行 php 进程,然后发出请求。如果您的 php 崩溃,您现在可以使用 (gdb) where 命令查看导致崩溃的调用堆栈。

除此之外,您可以从源构建 php 包,禁用优化,并进行源调试。

所有这些都假定您知道如何编译程序包、如何调试 C 代码等。如果您不知道,则必须招募知道的人。