2008-09-23 9 views
13

¿Qué significa cuando da una traza inversa con la siguiente salida?¿Qué significa el mensaje de traza inversa de GDB "0x0000000000000000 in ??()"?

#0 0x00000008009c991c in pthread_testcancel() from /lib/libpthread.so.2 
#1 0x00000008009b8120 in sigaction() from /lib/libpthread.so.2 
#2 0x00000008009c211a in pthread_mutexattr_init() from /lib/libpthread.so.2 
#3 0x0000000000000000 in ??() 

El programa se ha bloqueado con una señal estándar 11, fallo de segmentación. Mi aplicación es un programa FastCGI C++ de subprocesos múltiples que se ejecuta en FreeBSD 6.3, utilizando pthread como biblioteca de subprocesos.

Se ha compilado con -g y todas las tablas de símbolos para mi fuente se cargan, según las fuentes de información.

Como es evidente, ninguno de mi código real aparece en la traza, sino que el error parece provenir de las bibliotecas pthread estándar. En particular, ¿qué es?() ???

EDIT: eventualmente rastreó el crash hasta un acceso de memoria estándar no válido en mi código principal. No explica por qué el seguimiento de la pila estaba dañado, pero esa es una pregunta para otro día :)

Respuesta

9

gdb no pudo extraer la dirección de devolución correcta de pthread_mutexattr_init; obtuvo una dirección de 0. El "??" es el resultado de buscar la dirección 0 en la tabla de símbolos. No puede encontrar un nombre simbólico, por lo que imprime un "??" predeterminado

Desafortunadamente, de improviso no sé por qué no pudo extraer la dirección de devolución correcta.

3

Asegúrese de compilar con símbolos de depuración. (Para gcc, creo que es la opción -g). Entonces deberías poder obtener información más interesante de GDB. No olvide apagarlo cuando compila la versión de producción.

0

Tal vez el error que causó el bloqueo ha roto la pila (partes sobrescritas de la pila)? En ese caso, la traza inversa puede ser inútil; no hay idea de qué hacer en ese caso ...

5

Algo que hizo que la biblioteca de subprocesos se bloquee. Como la biblioteca de threading no está compilada con símbolos de depuración (-g), no puede mostrar el archivo de código fuente o el número de línea en el que ocurrió el bloqueo. Además, dado que son subprocesos, la pila de llamadas no apunta a su archivo. Desafortunadamente, este será un error difícil de rastrear, necesitará pasar por su código y tratar de limitar cuándo ocurre exactamente el accidente.

2

Me podría estar faltando algo, pero ¿no es esto indicativo de alguien que usa NULL como un puntero a la función?

#include <stdio.h> 

typedef int (*funcptr)(void); 

int 
func_caller(funcptr f) 
{ 
    return (*f)(); 
} 

int 
main() 
{ 
    return func_caller(NULL); 
} 

Esto produce el mismo estilo de una traza inversa si se ejecuta en GDB:

rivendell$ gcc -g -O0 foo.c -o foo 
rivendell$ gdb --quiet foo 
Reading symbols for shared libraries .. done 
(gdb) r 
Starting program: ... 
Reading symbols for shared libraries . done 

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000 
0x00000000 in ??() 
(gdb) bt 
#0 0x00000000 in ??() 
#1 0x00001f9d in func_caller (f=0) at foo.c:8 
#2 0x00001fb1 in main() at foo.c:14 

Este es un accidente muy extraño, aunque ... pthread_mutexattr_init rara vez hace algo más de asignar una estructura de datos y memset it. Buscaría algo más. ¿Existe la posibilidad de que las bibliotecas de hilos no coincidan o algo así? Mi conocimiento de BSD está un poco anticuado, pero solía haber problemas al respecto.

Cuestiones relacionadas