Pergunta

Atualmente, estou portando o nosso código de um alfa (Tru64) para um processador i386 (Linux) em C. Tudo tem ido muito bem até que eu olhei para portar o nosso rotina de tratamento de excepção. Atualmente, temos um processo-mãe que gera lotes de sub processos, e quando um destes sub-processos da fatais (unfielded) Eu tenho rotinas para pegar o processo.

Atualmente, estou lutando para encontrar o melhor método de implementação de uma rotina de rastreamento que pode listar os endereços de função no log de erro, atualmente minha rotina apenas imprime o sinal que causou a exceção eo código de qualificação de excepção.

Qualquer ajuda seria muito recebido, idealmente eu ia escrever manipulação de erro para todos os processadores, no entanto, nesta fase, eu só realmente se preocupam com i386 e x86_64.

Graças

Mark

Foi útil?

Solução

O funções glibc backtrace() e backtrace_symbols(), de execinfo.h, pode ser de uso.

Outras dicas

Você pode olhar para http://tlug.up.ac.za /wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV . Ele abrange a funcionalidade que você precisa. No entanto, você deve ligar contra libgdb e libdl, compilação com -rdynamic (inclui mais símbolos no executável), e renunciar à utilização de algumas otimizações.

Existem dois GNU (não-POSIX) funções que podem ajudá-lo - backtrace() e backtrace_symbols() - primeiros retornos matriz de endereços de função e endereços segundo resolve nomes. Infelizmente nomes de funções estáticas não podem ser resolvidos.

Para fazê-lo funcionar você precisa compilar o seu binário com bandeira -rdynamic.

Infelizmente, não há um "melhor" método desde o layout da pilha pode variar dependendo da CPU, o sistema operacional eo compilador usado para compilar o código. Mas este artigo pode ajudar .

Note que você deve implementar isso no processo filho ; o processo pai só fica um sinal de que algo está errado; você não obter uma cópia da pilha de criança.

Se um comentário, você indicar que você está usando gcc. Este http: //gcc.gnu .org / onlinedocs / gcc-4.4.3 / gcc / Return-Address.html # Retorno-Endereço poderia ser útil.

Se você está bem com apenas ficando 'backtraces' quando executando através valgrind, então esta pode ser uma opção para você:

VALGRIND_PRINTF_BACKTRACE (formato, ...):

Ele lhe dará o registo de chamadas para todas as funções, incluindo as estáticas.

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