Lo primero que hay que buscar es el mensaje de error que se obtiene cuando el programa se bloquea. Esto a menudo le dirá qué tipo de error ocurrió. Por ejemplo, "fallo de segmentación" o "SIGSEGV" casi con seguridad significa que su programa ha desreferenciado un puntero NULL o inválido. Si el programa está escrito en C++, el mensaje de error a menudo le dirá el nombre de cualquier excepción no detectada.
Si no aparece el mensaje de error, ejecute el programa desde la línea de comandos o canalice su salida a un archivo.
Para que un archivo core sea realmente útil, debe compilar su programa sin optimización y con información de depuración. GCC necesita las siguientes opciones: -g -O0
. (Asegúrese de que su compilación no tenga ninguna otra opción de -O
.)
Una vez que tenga el archivo de memoria, y luego abrirlo en GDB con:
gdb YOUR-APP COREFILE
Tipo where
para ver el punto donde ocurrió el accidente. Básicamente estás en una sesión de depuración normal: puedes examinar variables, subir y bajar la pila, alternar entre hilos y lo que sea.
Si su programa se ha bloqueado, es probable que sea un acceso de memoria no válido, por lo que debe buscar un puntero que tenga valor cero o que apunte a datos de aspecto incorrecto. Puede que no encuentres el problema en la parte inferior de la pila, es posible que tengas que subir algunos niveles antes de encontrar el problema.
¡Buena suerte!
Gracias por su respuesta detallada. El servidor ha sido compilado con información de depuración y crea un volcado de núcleo cuando se bloquea. El servidor inicializa muchos hilos. Cuando los subprocesos son inferiores a 200, el servidor permanece funcionando durante poco más de una hora, pero cuando el aumento en el número de solicitudes aumenta el número de subprocesos en el grupo a aproximadamente 300, el servidor se bloquea mucho antes. ¿Puede decirme por favor cómo puede ayudar el uso de una versión de depuración de malloc? –
En cuanto a 'depuración Malloc': si el problema es el abuso de memoria, entonces la depuración malloc ayudará al registrar más información sobre el espacio asignado, generalmente asignando más espacio, por lo que cuando se invocan sus funciones, pueden detectar varios géneros de abuso de memoria al principio del proceso, lo que limita el daño causado y generalmente facilita la detección del problema. Por ejemplo, si libera un trozo de memoria ya liberado, puede informarlo, en lugar de simplemente tomarlo gratis y trabajar con la información que realmente no existe. Consulte K & R para una implementación simple de malloc(). –
Con respecto a 'menos de 200 hilos OK; más de 300 choques antes "; ¿ha investigado si el servidor asigna un grupo de tamaño fijo de algún recurso (tal vez 200, tal vez 256) y no verifica adecuadamente el agotamiento de ese recurso. Puede ser un conjunto de mutexes, semáforos u otra cosa que desencadene un abuso de memoria. ¿El código del servidor que escribiste? ¿Debería considerar limitar el número de hilos en el trabajo? –