2009-05-27 10 views
9

Tengo linux C++ aplicación multiproceso. Ahora está probado en servidores de producción y tiene segfault. El problema es que no puedo reproducir ese error en ninguno de mis servidores de prueba y no tengo acceso a los servidores de producción. No tengo ningún volcado ni ninguna otra información útil. Única línea: violación de segmento en 0000000046bf0fb8 rip 000000000048ac6b RSP 0000000046bf0fa0 de error 6Linux/C++ Cómo depurar la aplicación de lanzamiento

me gustaría preguntar comunidad puedo obtener de dicha línea de alguna información que le ayudará zona de posibles lugares donde debería buscar disminuir. No puedo ejecutar la compilación de depuración en la producción debido a su baja velocidad. ¿Qué puedo agregar al lanzamiento que me ayuda a depurar? Este error parece un error multithread, y difícil de reproducir. Pero no estoy seguro, porque la aplicación funciona con muchos correos electrónicos diferentes de MTA.

Plataforma: Linux

línea Compilador: g ++ -O3 -D_REENTRANT

Gracias.

upd .: Gracias por sus respuestas. Puedo incluir información de depuración. Me gustaría conocer los métodos básicos de depuración de compilaciones de lanzamiento. Por ejemplo, tengo descarga y versión de lanzamiento. ¿Cómo debería continuar? ¿Qué debería leer sobre eso? ¿Puede explicar en pocas palabras cómo depura su aplicación si es posible? Gracias.

Respuesta

5

He estado leyendo los manuales de gdb recientemente, y recomiendan dejar los símbolos de depuración en, p. Ej. g++ -g.

Dado que no tiene acceso al servidor de producción, puede incluir algunas funciones básicas de registro que generarán una salida de datos en un archivo de texto. Debería poder reducir aproximadamente donde se produce el error, según los datos que se hayan enviado a su archivo de registro.

12

Como mencionó Andy, deje los símbolos de depuración cuando realice las versiones de lanzamiento.

Si esto hace que el tamaño del ejecutable final sea inaceptablemente grande, puede hacer una copia del ejecutable final y ejecutarlo a través de strip para eliminar los símbolos de depuración. De esta manera tiene dos ejecutables que son idénticos excepto uno tiene símbolos de depuración y el otro no. Coloque el que no tiene símbolos en el servidor de producción. Cuando se segmenta, depure contra la copia del ejecutable que todavía contiene símbolos de depuración.

3

Puede (y debe) generar ejecutables de versiones con información de depuración. Si no desea distribuir los archivos ejecutables que contienen la información de depuración, puede separate la información de depuración e instalarla más adelante para la depuración. Eso es lo que hacemos en nuestra aplicación.

+0

Gracias. Puedo incluir información de depuración. Me gustaría conocer los métodos básicos de depuración de compilaciones de lanzamiento. Por ejemplo, tengo descarga y versión de lanzamiento. ¿Cómo debería continuar? ¿Qué debería leer sobre eso? ¿Puede explicar en pocas palabras cómo depura su aplicación si es posible? Gracias. – Dmitriy

+0

@Dmitriy Las versiones de versiones de depuración no son en modo alguno diferentes a las depuraciones de depuración. Puede experimentar que no puede ver ciertas variables cuando avanza en el código, ya que el compilador puede haberlas optimizado lejos de esa ubicación, pero de lo contrario es igual a la depuración de una versión no liberada. – lothar

4

Puede usar gdb para obtener un rastreo de su programa en el punto en que segmenta aunque no haya compilado su aplicación con los indicadores de depuración. Esto al menos te dará una idea de dónde se segmenta tu aplicación.

gdb <your_app_exe> 
gdb> run 
gdb> backtrace 

o

gdb <your_app_exe> 
gdb> core-file <generated_core_file> 
1

así he encontrado otra solución, que yo estoy usando con mucha frecuencia, normalmente nos dan la pila (que nos dieron en este caso).

tengo un ejecutable que implementamos en una plataforma incrustada. digamos que mi ejecutable es servidor. uso addr2line -e./ server y pego la pila que recibí del cliente. le dará los detalles de la línea donde ocurre el problema.

podría ayudarle.

Gracias

Cuestiones relacionadas