2012-04-10 15 views
5

estoy usando traza inversa() y backtrace_symbols() para traza de salida en SIGSEGV y otras señales en formato de esta manera:Cómo interpretar direcciones backtrace para la depuración con GDB

0: [0xb750818] 
1: /opt/server/libQtScript.so.4(+0x6f42a) [0xb782c42a] 
2: /opt/server/libQtScript.so.4(+0x7bffc) [0xb7838ffc] 
3: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946] 
4: /opt/server/libQtScript.so.4(+0x7c4bc) [0xb78394bc] 
5: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946] 
6: /opt/server/libQtScript.so.4(+0x9603e) [0xb785303e] 
7: /opt/server/libQtScript.so.4(_ZN12QScriptValue4callERKS_RK5QListIS_E+0x2e7) [0xb7891647] 

En este caso particular, el marco # 7 está bien para mí, aunque el cuadro 1-6 me da algunas direcciones tipo "+ x".

¿Cómo obtener la línea exacta en el desmontaje para "+ 0x6f42a" y otras direcciones en GDB? ¿Y qué marco # 0, sin módulo descrito, significa?

Respuesta

8

Como llegar línea exacta de desmontar para "+ 0x6f42a" y otras direcciones en GDB?

gdb /opt/server/libQtScript.so.4 
(gdb) x/10i 0x6f42a 

Por lo general, usted querrá instrucciones que ejecutan antes 0x6f42a, por lo que va a hacer esto:

(gdb) x/20i 0x6f42a-30 

Ignorar las primeras instrucciones: usted podría comenzar el desmontaje de una media de uno. Por lo general, el desensamblaje volverá a sincronizarse después de unas pocas instrucciones, y comenzará a mostrar la secuencia de instrucciones correctas después de eso.

¿Y qué cuadro # 0, sin módulo descrito, significa?

Su biblioteca ha sido despojado de símbolos, por lo que los únicos símbolos que ver (por ejemplo _ZN12QScriptValue4callERKS_RK5QListIS_E) son las externamente visibles unos (también conocido como exportadas).

Hay un archivo de símbolos libQtScript.so.4.5.2.debug en la carpeta QT_SOURCE/lib. Entonces, ¿debería copiar el archivo .debug cerca del ejecutable para obtener una traza inversa con símbolos completos?

BGF debe cargar símbolos de libQtScript.so.4.5.2.debug automáticamente si se establece debug-file-directory a $QT_SOURCE/lib.

Actualización:

Me Ment conseguir traza con símbolos sin asociar BGF

no creo que no hay ningún apoyo en backtace_symbols() para cargar archivos debuginfo separadas.

+0

debug-file-directory es para GDB, pero estoy obteniendo traza inversa con símbolos sin adjuntar GDB. ¿Cómo asegurarse de que backtrace_symbols() obtenga todos los datos de símbolos? ¿Sería suficiente colocar un archivo .debug? Estos bloqueos son raros, por lo que no puedo reproducirlos en el entorno de desarrollo de la mina. –

0

Si ha compilado libQTScript con símbolos de depuración, obtendrá una mejor traza inversa con los nombres de las funciones y los valores de los parámetros. No sé exactamente cómo extraer la misma información sin símbolos de depuración (aunque debería ser posible si tienes el archivo de mapa o archivo de tabla de símbolos correcto de libQTScript).

Pero la manera más fácil es instalar libqt con símbolos de depuración y volver a ejecutar la traza inversa. Si están instaladas las libs depuradas y depuradas y gdb elige la depurada, intente apuntar gdb a las bibliotecas de depuración con LD_LIBRARY_PATH = path/to/debug/libs. (Ver esta respuesta para otro método de fijar la ruta de How do I prepend a directory the library path when loading a core file in gdb on Linux)

+0

Hay un archivo de símbolo libQtScript.so.4.5.2.debug en la carpeta QT_SOURCE/lib. Entonces, ¿debería copiar el archivo .debug cerca del ejecutable para obtener una traza inversa con símbolos completos? –

+0

Puede decirle a gdb que use ese archivo como tabla de símbolos. Pruebe el comando add-symbol-file desde dentro de gdb y vea si funciona. Luego escribe bt nuevamente para rastrear. –

+0

El archivo add-symbol quiere una dirección de memoria como argumento. Creo que puedes obtener la dirección examinando el resultado del comando: info sharedlibrary (inicia la depuración y luego emite el comando info). –

Cuestiones relacionadas