Pregunta

Actualmente estoy portar nuestro código de un alfa (Tru64) a un procesador i386 (Linux) en C. Todo ha ido bastante bien hasta que me miraba en nuestra portar rutina de manejo de excepciones. Actualmente tenemos un proceso padre, que engendra una gran cantidad de sub procesos, y cuando uno de estos sub-procesos de fatales (unfielded) que tienen rutinas para coger el proceso.

Actualmente estoy luchando para encontrar el mejor método de implementar una rutina de rastreo que puede enumerar las direcciones de las funciones en el registro de errores, actualmente mi rutina simplemente imprime el la señal que causó la excepción y el código de excepción calificador.

Cualquier ayuda sería recibida en gran medida, lo ideal sería que iba a escribir el manejo de errores para todos los procesadores, sin embargo en esta etapa lo único que realmente importa i386 y x86_64.

Gracias

Marcar

¿Fue útil?

Solución

Las funciones de glibc backtrace() y backtrace_symbols(), desde execinfo.h, podrían ser de utilidad.

Otros consejos

Es posible mirar a http://tlug.up.ac.za /wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV . Abarca la funcionalidad que necesita. Sin embargo, debe enlazar con libgdb y libdl, compilar con -rdynamic (incluye más símbolos en el ejecutable), y renunciar a la utilización de algunas optimizaciones.

Hay dos funciones de GNU (no POSIX) que pueden ayudarle - backtrace() y backtrace_symbols() - primera serie de retornos direcciones de las funciones y la segunda resuelve direcciones a nombres. Desafortunadamente nombres de funciones estáticas no pueden ser resueltos.

Para que funcione necesita compilar el binario con la bandera -rdynamic.

Por desgracia, no hay un método "mejor", ya que el diseño de la pila puede variar dependiendo de la CPU, el sistema operativo y el compilador utilizado para compilar el código. Pero este artículo puede ayudar a .

Tenga en cuenta que debe implementar esto en el proceso hijo ; el proceso padre sólo se pone una señal de que algo está mal; usted no recibe una copia de la pila del hijo.

Si un comentario, usted indica que está utilizando gcc. Este http: //gcc.gnu .org / onlinedocs / gcc-4.4.3 / gcc / Return-Address.html # Volver Dirección podría ser útil.

Si usted está muy bien, con sólo consiguen trazas inversas adecuadas cuando se ejecuta a través valgrind, entonces esto podría ser una opción para usted:

VALGRIND_PRINTF_BACKTRACE (formato, ...):

Se le dará la traza inversa para todas las funciones, incluyendo los estáticos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top