如何调试 semop 失败?

如何调试 semop 失败?

使用Linux执行2.6.30-gentoo-r4非常复杂的代码系统(使用 4.4.9-pl0-gentoo 和 5.2.10-pl0-gentoo),偶尔会遇到信号量阻塞问题。对函数php的调用被阻止,最终导致系统崩溃。phpsem_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不存在(请参阅建议信息)。

相关内容