• Gerar coredump em programa C

    Data:2011.09.13 | Categorialinux | Tags: ,,,

    Quando um programa termina inexperadamente, o Linux pode gerar um dump da área de memória deste programa no momento do crash, para depuração. Acontece que o seu ambiente pode estar configurado para não gerar esse dump. Uma maneira de conferir isto é executando o seguinte comando:

    # ulimit -c

    O número retornado é o tamanho máximo que o coredump pode ter em kb. Caso seja 0, significa que não será gerado coredump. Para garantir a geração, o valor pode ser especificado como infinito:

    # ulimit -c unlimited

    O problema é que seu programa pode estar rodando em uma sessão diferente, e assim, os limites podem varias. Desta maneira, o próprio programa pode alterar este parâmetro em tempo de execução. Segue um pequeno código de exemplo:

    #include <signal.h>
    #include <sys/time.h>
    #include <sys/resource.h>
    
    int main(int ac,char *av[]) {
    struct rlimit limit;
    limit.rlim_cur=RLIM_INFINITY;
    limit.rlim_max=RLIM_INFINITY;
    
    setrlimit(RLIMIT_CORE,&limit);
    printf("%d\n",10/0);
    
    return 0;
    }
    

    Neste exemplo, foi usada a struct rlimit. Seus membros são rlim_cur e rlim_max, sendo eles softlimit e hardlimit respectivamente. O valor definido para ambos foi infinito (RLIM_INFINITY). Para efetivar a alteração, usa-se a função setrlimit. Veja que este código exemplo irá terminar  em crash, pois há uma divisão por zero e o coredump deverá ser gerado.