mmap () falhou: Não é possível alocar memória - como descubro quem está reclamando?

5

mmap () falhou ao aparecer nos meus .xsession-errors em bursts. Mas não há indicação sobre qual aplicativo está falhando. Como eu olho para isso depois que aconteceu? Eu normalmente descubro as falhas apenas quando ocasionalmente mudo para o meu espaço de trabalho "tail -f .logs / *".

    
por lkraav 23.08.2012 / 23:55

1 resposta

7

Você pode usar o SystemTap para esse tipo de coisa.

  • Primeiro, configure seu sistema. Você precisa do SystemTap, cabeçalhos correspondentes ao seu kernel em execução e símbolos de depuração para o mesmo. No Debian, fazê-lo funcionar é algo como:

    sudo apt-get install systemtap
    sudo apt-get install linux-headers-$(uname -r)
    sudo apt-get install linux-image-$(uname -r)-dbg
    

    Pode ser um pouco difícil fazê-lo funcionar, porque os cabeçalhos e símbolos do kernel precisam corresponder exatamente ao seu kernel em execução. Espero que seja simples no Gentoo.

  • Em seguida, salve este arquivo como mmap.stp :

    #! /usr/bin/env stap
    # -*- systemtap -*-
    
    global last_args
    
    probe syscall.mmap2 {
            last_args[tid()] = argstr;
    }
    
    probe syscall.mmap2.return {
            errno = errno_p(returnval())
            if (errno != 0) {
                    printf("%s[%d] mmap2(%s) failed: %d (%s)\n",
                           execname(), pid(), last_args[tid()],
                           errno, errno_str(errno));
            }
    }
    
    probe begin {
            printf("begin\n");
    }
    
    probe end {
            printf("end\n");
    }
    
  • Execute com

    sudo stap mmap.stp
    

Depois que ele compilar e imprimir begin , ele assistirá a todas as chamadas do sistema mmap() e salvará seus argumentos. Se ocorrer um erro, você obterá uma saída que inclui o nome do programa, a ID do processo, os argumentos e o código de erro. Por exemplo, executando este programa sem sentido:

int main() {
        mmap(1,-1,123,0,1,0);
}

fornece a saída do SystemTap:

test[9601] mmap2(0x1, 4294967295, PROT_READ|PROT_WRITE|PROT_SEM|0x70, 0x0, 1, 0) failed: 22 (EINVAL)
    
por 24.08.2012 / 06:57