使用Linux执行2.6.30-gentoo-r4
非常复杂的代码系统(使用 4.4.9-pl0-gentoo 和 5.2.10-pl0-gentoo),偶尔会遇到信号量阻塞问题。对函数php
的调用被阻止,最终导致系统崩溃。php
sem_acquire
然而,这个有问题的信号量似乎没有被另一个php
进程阻止,这促使我进一步调查。我能够识别php
有问题的进程及其strace
,导致阻塞信号量:
....
09:03:25 gettimeofday({1415696605, 778078}, NULL) = 0
09:03:25 close(5) = 0
09:03:25 gettimeofday({1415696605, 778483}, NULL) = 0
09:03:25 gettimeofday({1415696605, 778708}, NULL) = 0
09:03:25 semop(0, 0xbf8f1692, 1 <unfinished ...>
这个特定的输出semop(0, 0xbf8f1692, 1)
对我来说没有太大帮助,因为我看不到struct sembuf
(的第二个参数semop
)的内容。也许其他人直接看到这个调用有问题semop
?
无论如何,我继续调查以检查地址处的内存0xbf8f1692
(作为根):
> gdb --pid 1236
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i586-pc-linux-gnu".
Attaching to process 1236
ptrace: Operation not permitted.
(gdb) dump memory /root/output 0xbf8f1692 0xbf9f1692
(gdb) quit
> hexdump -C output
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00100000
这是否意味着semop
被调用时struct sembuf
指向一堆零?还是我做错了什么,没有找出内存来查看 的参数是什么?有没有其他方法可以查看该调用semop
中发生了什么?semop
附加信息:
- Linux 系统既不知道命令
prctl
也不知道ptrace
. - 名为的目录
/proc/sys/kernel/yama
不存在(请参阅建议信息)。