semop の失敗をデバッグするにはどうすればいいですか?

semop の失敗をデバッグするにはどうすればいいですか?

Linuxを使用すると、2.6.30-gentoo-r4非常に複雑なコード システムが実行され (4.4.9-pl0-gentoo および 5.2.10-pl0-gentoo を使用)、セマフォ ブロッキングの問題が発生することがあります。関数phpの呼び出しがブロックされ、最終的にシステムがクラッシュします。phpsem_acquire

しかし、問題のセマフォは別のプロセスによってブロックされていないようで、さらに調査することにしました。問題のプロセスを特定し、セマフォをブロックする原因をphp特定できました。phpstrace

....
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 ...>

この特定の出力は、 ( の 2 番目の引数)semop(0, 0xbf8f1692, 1)の内容が見えないため、あまり役に立ちません。おそらく、他の誰かがこの呼び出しで直接問題に気付いているのでしょうか?struct sembufsemopsemop

とにかく、私は調査を続けて、アドレスのメモリをチェックしました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が存在しません(提案情報)。

関連情報