Como depurar uma falha semop?

1

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:

  • O sistema Linux não conhece o comando prctl nor ptrace .
  • Um diretório chamado /proc/sys/kernel/yama não existe (consulte informações sugeridas ).
por Alex 17.06.2014 / 15:44

0 respostas