Como depurar uma falha semop?

Como depurar uma falha semop?

Usando um 2.6.30-gentoo-r4Linux, um sistema de código muito complexo phpé executado (com 4.4.9-pl0-gentoo e 5.2.10-pl0-gentoo), que ocasionalmente apresenta problemas de bloqueio de semáforo. A chamada para a phpfunção sem_acquireé bloqueada, fazendo com que o sistema trave.

Contudo, este semáforo em questão não parece estar bloqueado por outro phpprocesso, o que me levou a investigar mais a fundo. Consegui identificar o phpprocesso em questão e a straceele, levando ao semáforo de bloqueio:

....
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 ...>

Esta saída específica semop(0, 0xbf8f1692, 1)não me ajuda muito, pois não consigo ver o conteúdo de struct sembuf(segundo argumento para semop). Talvez alguém veja um problema diretamente nesta semopchamada?

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 o semopé chamado apontando struct sembufpara vários zeros? Ou fiz algo errado para descobrir a memória e ver quais semopsão os argumentos? Existem diferentes maneiras de ver o que está acontecendo nessa semopchamada?

Informações adicionais:

  • O sistema Linux não conhece o comando prctlnem o arquivo ptrace.
  • Um diretório nomeado /proc/sys/kernel/yamanão existe (vejainformações sugeridas).

informação relacionada