Tengo una aplicación multiplataforma muy compleja. Recientemente mi equipo y yo hemos estado realizando pruebas de estrés y nos hemos encontrado con varios bloqueos (y volcados de núcleo que los acompañan). Algunos de estos volcados centrales son muy precisos y me muestran la ubicación exacta donde ocurrió el bloqueo con alrededor de 10 o más marcos de pila. Otros a veces tienen solo un marco de pila con ?? siendo el único símbolo!¿Cómo aumentar la probabilidad de que los volcados centrales de Linux coincidan con los símbolos?
Lo que me gustaría saber es:
- ¿Hay una manera de aumentar la probabilidad de núcleo vertederos apuntando en la dirección correcta?
- ¿Por qué no se informa la cantidad de cuadros de pila consistentes?
- Cualquier recomendación de mejores prácticas para la administración de volcados de núcleo.
Así es como puedo compilar los binarios (en modo de lanzamiento):
- compilador y la plataforma: g ++ con glibc-2.3.2-95.50 en CentOS 3.6 x86_64 - Esto me ayuda a mantener la compatibilidad con versiones anteriores de versiones de Linux.
- Todos los archivos se compilan con el distintivo -g.
- Los símbolos de depuración se eliminan del archivo binario final y se guardan en un archivo separado.
- Cuando tengo un volcado del núcleo, uso GDB con el ejecutable que creó el núcleo y el archivo de símbolos. GDB nunca se queja de que haya un desajuste entre el núcleo/binario/símbolos.
Sin embargo, a veces obtengo almacenes sin ningún símbolo. Es comprensible que esté enlazando con una versión sin depuración de libstdC++ y libgcc, pero sería bueno si al menos el rastreo de la pila me muestra dónde en mi código se originó la llamada a la instrucción defectuosa (aunque en última instancia puede terminar en ??) .
Esto es altamente probable que sea el problema - si el marco de pila se ha roto por el insecto, luego se ha ido. – caf
Upvoted. Si el error está destruyendo la pila, no hay sustituto para fallar temprano y en voz alta. assert() es tu amigo. – user47559