Relatórios de falhas em C para Linux
Pergunta
Seguindo esta pergunta:
Boa biblioteca de relatórios de falhas em c#
Existe alguma biblioteca como CrashRpt.dll que faça o mesmo no Linux?Ou seja, gerar um relatório de falha incluindo um core dump e qualquer ambiente necessário e notificar o desenvolvedor sobre isso?
Editar:Esta parece ser uma duplicata de essa questão
Solução
Ver Obtendo rastreamentos de pilha em sistemas Unix automaticamente no estouro de pilha.
Outras dicas
Compile seu código com símbolos de depuração, insira unlimit coredumpsize em seu shell e você obterá um coredump na mesma pasta do binário.Use gdb/ddd - abra o programa primeiro e depois abra o core dump.Você pode checar esse para obter informações adicionais.
@Ionut
Isso gera o dump principal, mas não notifica o desenvolvedor quando outros usuários travam.
Nathan, em que circunstâncias em uma base de segmento diferente de zero?Nunca vi isso acontecer em meus 5 anos de desenvolvimento de aplicativos Linux.
Obrigado.
@Martinho
Eu faço validação arquitetônica para x86, então estou muito familiarizado com a arquitetura que o processador fornece, mas muito poucofamiliarizado com a forma como é usado.Foi nisso que baseei meu comentário.Se se pode contar com CR2 para dar a resposta correta, então estou corrigido.
Nathan, eu não estava insistindo que você estava errado;Eu estava dizendo que na minha experiência (limitada) com Linux, a base do segmento é sempre zero.Talvez seja uma boa pergunta para eu fazer...
Observação:existem dois registros interessantes em um x86
falha de falha secundária.
O primeiro, PEI, especifica o endereço do código no qual ocorreu a exceção.Na resposta de RichQ, ele usa addr2line para mostrar a linha de origem que corresponde ao endereço do travamento.Mas o EIP pode ser inválido;se você chamar um ponteiro de função nulo, ele pode ser 0x00000000
, e se você corromper sua pilha de chamadas, o retorno poderá inserir qualquer valor aleatório no EIP.
O segundo, CR2, especifica o endereço de dados que causou a falha de segmentação.No exemplo de RichQ, ele está configurando i como um ponteiro nulo e depois acessando-o.Neste caso, CR2 seria 0x00000000
.Mas se você mudar:
int j = *i
para:
int j = i[2];
Então você está tentando acessar o endereço 0x00000008
, e é isso que seria encontrado no CR2.