Strace: ERROS no acesso [fechado]

0

Estou executando um executável (do programa c) com o comando strace e recebo a seguinte saída. Por favor, ajude-me por que isso dá erro no acesso e também todo este processo é morto no final?

Por favor, me dê alguma orientação de quais podem ser as possíveis razões por trás disso.

    
por Xara 10.10.2013 / 05:29

1 resposta

3

O fato de seu programa chamar brk(2) tantas vezes (8843) me faz pensar que seu código está solicitando muita memória do sistema. E geralmente, no Linux, quando um programa solicita muita memória, ele é eliminado com SIGKILL .

Mais detalhes

brk(2) é uma das duas maneiras de um programa solicitar memória. A outra maneira é mmap(2) . As implementações de malloc(3) e amigos oferecidas pela Biblioteca GNU C usam uma combinação das duas.

De um modo geral, qualquer que seja a maneira como seu programa aloca memória, o Linux não reclama. Mesmo que não haja memória disponível, é possível que o kernel ainda retorne endereços válidos.

Isso porque o Linux aloca a memória preguiçosamente , no sentido de que a memória não é "fisicamente alocada" até que você comece a usá-la. Essa é uma ótima otimização de desempenho.

Agora, o que acontece quando você tenta usar alguma memória, mas a RAM e a troca do sistema estão cheias? Se o Linux alocou sua memória fisicamente, então não há problemas. Além disso, um componente chamado OOM killer inicia a eliminação de processos que consomem a maior parte da memória, com o objetivo de manter o sistema utilizável.

Sobre o acesso

Você observou que strace -c está relatando 4 access(2) de falhas. Isso certamente não é um sintoma de um problema. Está perfeitamente bem para uma chamada de sistema falhar. Problemas ocorrem quando o seu programa não lida com falhas.

Um exemplo:

$ strace -e trace=stat -- ls /abc 
stat("/abc", 0x1df2e30)                 = -1 ENOENT (No such file or directory)
ls: cannot access /abc: No such file or directory
+++ exited with 2 +++

Eu disse a ls para listar o conteúdo de um diretório inexistente ( /abc ), portanto, a chamada para stat(2) falhou com ENOENT . Este não é um problema para o ls : ele detectou a falha e exibiu uma mensagem de erro.

Problemas teriam ocorrido se ls não tivesse verificado o valor de retorno de stat(2) .

Sobre o seu problema específico: é difícil saber por que o acesso falhou. A saída de strace -e trace=access ou strace -C fornecerá alguns resultados. No entanto, acredito firmemente que tais falhas não são um problema para você, pois elas provavelmente vêm da Biblioteca C do GNU:

$ strace -e trace=access -- ls
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
...
    
por Andrea Corbellini 11.10.2013 / 18:32