Linux를 사용하여 2.6.30-gentoo-r4
매우 복잡한 코드 시스템(4.4.9-pl0-gentoo 및 5.2.10-pl0-gentoo 사용)을 실행하면 때때로 세마포어 차단 문제가 발생합니다. 함수 호출 php
이 차단되어 결국 시스템이 충돌하게 됩니다.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 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
이것은 호출될 때 여러 개의 0을 가리킨다는 의미입니까 struct sembuf
? 아니면 내가 뭔가 잘못하고 있고 메모리가 어떤 매개변수를 보고 있는지 파악하지 못하고 있는 걸까요? semop
해당 통화에서 무슨 일이 일어나고 있는지 확인할 수 있는 다른 방법이 있나요 ?semop
추가 정보:
- Linux 시스템은 명령
prctl
이나ptrace
. - 이름이 지정된 디렉터리가
/proc/sys/kernel/yama
존재하지 않습니다(참조:제안).