2012-01-12 16 views
5

¿Puedo configurar lo que entra en un volcado de núcleo en Linux? Quiero obtener algo así como los mini-volcados de Windows (información mínima sobre el marco de la pila cuando la aplicación se colgó). Sé que puede establecer un tamaño máximo para los archivos del núcleo usando ulimit, pero esto no me permite controlar lo que va dentro del núcleo (es decir, no hay garantía de que si establezco el límite en 64 kb, se descargarán las últimas 16 páginas de la pila, por ejemplo).Volcado de núcleo mínimo (seguimiento de pila + marco actual solamente)

Además, me gustaría configurarlo de forma programática (desde el código), si es posible. He visto el archivo /proc/PID/coredump_filter mencionado por man core, pero parece demasiado grueso para mis propósitos.

Para proporcionar un pequeño contexto: necesito pequeños archivos de núcleo, por varias razones: necesito recopilarlos en la red, para numerosos (miles) de clientes; Además, estos son dispositivos integrados con pequeñas tarjetas SD y módems GPRS para la conexión de red. Entonces, cualquier cosa superior a ~ 200k está fuera de dudas.

EDITAR: Estoy trabajando en un dispositivo incrustado que ejecuta Linux 2.6.24. El procesador es PowerPC. Por desgracia, PowerPC-Linux es no soportados en Breakpad en este momento, por lo que Google Breakpad no es una opción

+1

No tengo idea, y la respuesta yace probablemente dentro del código fuente del kernel (porque no hay especificaciones relacionadas con eso). ¿Por qué preguntas? Con los discos actuales, un límite de volcado de núcleo de 64Mb es aún pequeño, y muy probablemente contenga suficiente información. ¿Por qué necesita establecer el límite a un valor tan pequeño como 64 kb? ? –

+3

Google Breakpad escribe minivolcados en todas las plataformas, incluido Linux. –

+0

Pregunto porque estoy usando un dispositivo incrustado, que tiene un pequeño disco flash y especialmente una conexión lenta de gprs para descargar datos ... ¡Quiero que sea lo más pequeño posible! –

Respuesta

5

tengo "resuelto" este problema de dos maneras:

  1. Instalé un manejador de señal para SIGSEGV, y usé backtrace/backtrace_symbols para imprimir el seguimiento de la pila. Recopilé mi código con -dinámica, por lo que incluso después de eliminar la información de depuración todavía obtengo una traza inversa con nombres significativos (manteniendo el ejecutable suficientemente compacto).
    Quité la información de depuración y la puse en un archivo separado, que guardaré en un lugar seguro, usando strip; a partir de ahí, utilizaré add22line con la información guardada desde el backtrace (direcciones) para comprender dónde ocurrió el problema. De esta forma tengo que almacenar solo unos pocos bytes.
  2. Alternativamente, encontré que podía usar el/proc/self/coredump_filter para no borrar memoria (estableciendo su contenido a "0"): solo el hilo y la información de proc, registros, stacktrace etc. se guardan en el núcleo. Ver más en this answer

Todavía pierdo información que podría ser preciosa (contenido de variables globales y locales, params ..). Podría fácilmente averiguar qué página (s) volcar, pero lamentablemente no hay forma de especificar un "volcado de estas páginas" para los volcados de núcleo normales (a menos que esté dispuesto a ir y parchear la función maydump() en el kernel).

Por ahora, estoy bastante contento con las soluciones allí 2 (que es mejor que nada ..) Mis próximos pasos serán:

  • ver lo difícil que sería al puerto Breakpad a PowerPC-Linux: ya hay powerpc-darwin e i386-linux así que ... ¿qué tan difícil puede ser? :)
  • intentan utilizar google-coredumper para volcar unas pocas páginas alrededor del ESP actual (que debería darme locales y parámetros) y alrededor de "& some_global" (eso debería darnos globales).
+0

Si bien sería sencillo bifurcar google-coredumper y modificar la función 'WriteCoreDump' para volcar páginas/direcciones específicas ... no tiene soporte para powerpc :( –

Cuestiones relacionadas