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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top