Usando um 2.6.30-gentoo-r4
Linux, um sistema muito complexo de php
code é executado (com 4.4.9-pl0-gentoo e 5.2.10-pl0-gentoo), que ocasionalmente é executado em um problema de bloqueio de semáforo. A chamada para o php
function sem_acquire
está bloqueada, levando o sistema a uma falha fatal.
No entanto, esse semáforo em questão não parece estar bloqueado por outro processo php
, o que me levou a investigar mais. Consegui identificar o processo php
em questão e strace
, levando ao bloqueio do semáforo:
....
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 ...>
Essa saída específica semop(0, 0xbf8f1692, 1)
não é de muita ajuda para mim, pois não consigo ver o conteúdo de struct sembuf
(segundo argumento para semop
). Talvez alguém veja um problema diretamente com essa chamada semop
?
De qualquer forma, continuei a investigação para verificar a memória no endereço 0xbf8f1692
(como root):
> 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
Isso significa que semop
é chamado com struct sembuf
apontando para zeros de grupo? Ou fiz algo errado para descobrir a memória para ver quais são os argumentos para semop
? Existem maneiras diferentes de ver o que está acontecendo na chamada semop
?
Informações adicionais:
prctl
nor ptrace
. /proc/sys/kernel/yama
não existe (consulte informações sugeridas ).