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

この特定の出力は(の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存在しません(参照:提案)。

ベストアンサー1

おすすめ記事