semop 실패를 디버깅하는 방법은 무엇입니까?

semop 실패를 디버깅하는 방법은 무엇입니까?

Linux 를 사용하면 2.6.30-gentoo-r4매우 복잡한 코드 시스템이 php실행되며(4.4.9-pl0-gentoo 및 5.2.10-pl0-gentoo 사용) 때때로 세마포어 차단 문제가 발생합니다. 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 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

이것은 무리 0을 가리키는 semop것으로 호출된다는 것을 의미합니까 ? struct sembuf아니면 인수가 무엇인지 확인하기 위해 메모리를 알아내기 위해 내가 뭔가 잘못한 걸까요 semop? 해당 semop통화 에서 무슨 일이 일어나고 있는지 확인할 수 있는 다양한 방법이 있나요 ?

추가 정보:

  • Linux 시스템은 명령 prctl도 모르고 ptrace.
  • 이름이 지정된 디렉터리가 /proc/sys/kernel/yama존재하지 않습니다(참조:제안된 정보).

관련 정보