2011-09-29 10 views
5

Cuando obtengo una señal de generación de coprocesos, quiero ejecutar mi propio controlador para copiar las estructuras siginfo_t y ucontext_t a variables globales, de modo que se pueda acceder a ellas en el volcado del núcleo. Actualmente, al final de mi controlador reasigno el controlador predeterminado y el aumento de llamada (thesig). El problema al hacerlo es que el volcado del núcleo "registros de información" muestra el estado de los registros en mi controlador, y no en el momento de la señal original. Me doy cuenta de que, como he guardado ucontext_t, puedo buscar los valores de registro originales, pero es probable que ese conocimiento se pierda/se olvide cuando los vertederos principales se pasan por el equipo.Linux: ¿Snoop una señal sin destrozar los registros para el siguiente volcado de núcleo?

Así que mi pregunta es: ¿hay alguna manera de volver a publicar una señal y asegurarse de que el archivo de volcado del núcleo retiene el estado de registro de la señal original? Pensé que tal vez podría usar un asm en línea para restaurar manualmente todos los regs al final del controlador, luego volver a las instrucciones que causaron la señal en lugar de llamar a raise(), pero no estoy seguro de si podemos garantizar que - la tentativa de la instrucción causará el mismo comportamiento de señalización que el primer intento.

Respuesta

3

copia las estructuras siginfo_t y ucontext_t a las variables globales, de manera que puedan ser accedidos en el núcleo volcado

Si volver a subir la señal en el controlador, entonces no hay necesidad de copiar cualquier cosa: los valores estarán en la pila y accesibles en el volcado del núcleo.

"registros de información" muestra el estado de los registros en mi controlador, y no en el momento de la señal original.

Eso sí, up 5 (o sin embargo muchos niveles que necesita dar un paso hasta llegar al punto de choque) y info reg nuevo.

¿Hay alguna forma de volver a generar una señal y asegúrese de que el archivo de volcado del núcleo retiene el estado de registro de la señal original?

Sí: establezca la disposición de la señal en SIG_DFL utilizando signal(signum, SIG_DFL); y devuélvala de su controlador. La instrucción que causó SIGSEGV se reiniciará y ahora provocará un volcado de núcleo inmediato.

+0

@ER, el volcado del núcleo apunta siempre a una ubicación incorrecta. :( – sree

Cuestiones relacionadas