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 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이것은 호출될 때 여러 개의 0을 가리킨다는 의미입니까 struct sembuf? 아니면 내가 뭔가 잘못하고 있고 메모리가 어떤 매개변수를 보고 있는지 파악하지 못하고 있는 걸까요? semop해당 통화에서 무슨 일이 일어나고 있는지 확인할 수 있는 다른 방법이 있나요 ?semop

추가 정보:

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

관련 정보