2011-01-18 16 views
61

¿Qué es este extraño error que estoy obteniendo? Estoy compilando C++ usando g ++ en Ubuntu 10.10. Aparece al azar cuando ejecuto el ejecutable (tal vez 2 veces en 8 horas, con 10 compilaciones por hora). Sin embargo, si limpio y vuelvo a compilar, desaparece la mayor parte del tiempo.Error: libre(): inválido siguiente tamaño (rápido):

*** glibc detected *** ./emailQueue.app: free(): invalid next size (fast): 0x0000000001c40270 *** 
======= Backtrace: ========= 
/lib/libc.so.6(+0x774b6)[0x7f490d95e4b6] 
/lib/libc.so.6(cfree+0x73)[0x7f490d964c83] 
./emailQueue.app[0x401f47] 
/lib/libc.so.6(__libc_start_main+0xfe)[0x7f490d905d8e] 
./emailQueue.app[0x401cc9] 
======= Memory map: ======== 
00400000-0040d000 r-xp 00000000 08:01 1311132       /home/server/Projects/email/emailQueue.app 
0060d000-0060e000 r--p 0000d000 08:01 1311132       /home/server/Projects/email/emailQueue.app 
0060e000-0060f000 rw-p 0000e000 08:01 1311132       /home/server/Projects/email/emailQueue.app 
01c40000-01c82000 rw-p 00000000 00:00 0         [heap] 
7f4908000000-7f4908021000 rw-p 00000000 00:00 0 
7f4908021000-7f490c000000 ---p 00000000 00:00 0 
7f490ce52000-7f490ce5e000 r-xp 00000000 08:01 1051251     /lib/libnss_files-2.12.1.so 
7f490ce5e000-7f490d05d000 ---p 0000c000 08:01 1051251     /lib/libnss_files-2.12.1.so 
7f490d05d000-7f490d05e000 r--p 0000b000 08:01 1051251     /lib/libnss_files-2.12.1.so 
7f490d05e000-7f490d05f000 rw-p 0000c000 08:01 1051251     /lib/libnss_files-2.12.1.so 
7f490d05f000-7f490d075000 r-xp 00000000 08:01 1048770     /lib/libz.so.1.2.3.4 
7f490d075000-7f490d275000 ---p 00016000 08:01 1048770     /lib/libz.so.1.2.3.4 
7f490d275000-7f490d276000 r--p 00016000 08:01 1048770     /lib/libz.so.1.2.3.4 
7f490d276000-7f490d277000 rw-p 00017000 08:01 1048770     /lib/libz.so.1.2.3.4 
7f490d277000-7f490d28e000 r-xp 00000000 08:01 1051248     /lib/libnsl-2.12.1.so 
7f490d28e000-7f490d48d000 ---p 00017000 08:01 1051248     /lib/libnsl-2.12.1.so 
7f490d48d000-7f490d48e000 r--p 00016000 08:01 1051248     /lib/libnsl-2.12.1.so 
7f490d48e000-7f490d48f000 rw-p 00017000 08:01 1051248     /lib/libnsl-2.12.1.so 
7f490d48f000-7f490d491000 rw-p 00000000 00:00 0 
7f490d491000-7f490d49a000 r-xp 00000000 08:01 1051244     /lib/libcrypt-2.12.1.so 
7f490d49a000-7f490d69a000 ---p 00009000 08:01 1051244     /lib/libcrypt-2.12.1.so 
7f490d69a000-7f490d69b000 r--p 00009000 08:01 1051244     /lib/libcrypt-2.12.1.so 
7f490d69b000-7f490d69c000 rw-p 0000a000 08:01 1051244     /lib/libcrypt-2.12.1.so 
7f490d69c000-7f490d6ca000 rw-p 00000000 00:00 0 
7f490d6ca000-7f490d6e2000 r-xp 00000000 08:01 1051256     /lib/libpthread-2.12.1.so 
7f490d6e2000-7f490d8e1000 ---p 00018000 08:01 1051256     /lib/libpthread-2.12.1.so 
7f490d8e1000-7f490d8e2000 r--p 00017000 08:01 1051256     /lib/libpthread-2.12.1.so 
7f490d8e2000-7f490d8e3000 rw-p 00018000 08:01 1051256     /lib/libpthread-2.12.1.so 
7f490d8e3000-7f490d8e7000 rw-p 00000000 00:00 0 
7f490d8e7000-7f490da61000 r-xp 00000000 08:01 1048743     /lib/libc-2.12.1.so 
7f490da61000-7f490dc60000 ---p 0017a000 08:01 1048743     /lib/libc-2.12.1.so 
7f490dc60000-7f490dc64000 r--p 00179000 08:01 1048743     /lib/libc-2.12.1.so 
7f490dc64000-7f490dc65000 rw-p 0017d000 08:01 1048743     /lib/libc-2.12.1.so 
7f490dc65000-7f490dc6a000 rw-p 00000000 00:00 0 
7f490dc6a000-7f490dc7f000 r-xp 00000000 08:01 1048655     /lib/libgcc_s.so.1 
7f490dc7f000-7f490de7e000 ---p 00015000 08:01 1048655     /lib/libgcc_s.so.1 
7f490de7e000-7f490de7f000 r--p 00014000 08:01 1048655     /lib/libgcc_s.so.1 
7f490de7f000-7f490de80000 rw-p 00015000 08:01 1048655     /lib/libgcc_s.so.1 
7f490de80000-7f490df02000 r-xp 00000000 08:01 1051246     /lib/libm-2.12.1.so 
7f490df02000-7f490e101000 ---p 00082000 08:01 1051246     /lib/libm-2.12.1.so 
7f490e101000-7f490e102000 r--p 00081000 08:01 1051246     /lib/libm-2.12.1.so 
7f490e102000-7f490e103000 rw-p 00082000 08:01 1051246     /lib/libm-2.12.1.so 
7f490e103000-7f490e1eb000 r-xp 00000000 08:01 4853329     /usr/lib/libstdc++.so.6.0.14 
7f490e1eb000-7f490e3ea000 ---p 000e8000 08:01 4853329     /usr/lib/libstdc++.so.6.0.14 
7f490e3ea000-7f490e3f2000 r--p 000e7000 08:01 4853329     /usr/lib/libstdc++.so.6.0.14 
7f490e3f2000-7f490e3f4000 rw-p 000ef000 08:01 4853329     /usr/lib/libstdc++.so.6.0.14 
7f490e3f4000-7f490e409000 rw-p 00000000 00:00 0 
7f490e409000-7f490e5c7000 r-xp 00000000 08:01 4851315     /usr/lib/libmysqlclient.so.16.0.0 
7f490e5c7000-7f490e7c7000 ---p 001be000 08:01 4851315     /usr/lib/libmysqlclient.so.16.0.0 
7f490e7c7000-7f490e7cc000 r--p 001be000 08:01 4851315     /usr/lib/libmysqlclient.so.16.0.0 
7f490e7cc000-7f490e816000 rw-p 001c3000 08:01 4851315     /usr/lib/libmysqlclient.so.16.0.0 
7f490e816000-7f490e817000 rw-p 00000000 00:00 0 
7f490e817000-7f490e837000 r-xp 00000000 08:01 1048597     /lib/ld-2.12.1.so 
7f490ea15000-7f490ea1c000 rw-p 00000000 00:00 0 
7f490ea33000-7f490ea37000 rw-p 00000000 00:00 0 
7f490ea37000-7f490ea38000 r--p 00020000 08:01 1048597     /lib/ld-2.12.1.so 
7f490ea38000-7f490ea39000 rw-p 00021000 08:01 1048597     /lib/ld-2.12.1.so 
7f490ea39000-7f490ea3a000 rw-p 00000000 00:00 0 
7fffb85b9000-7fffb85da000 rw-p 00000000 00:00 0       [stack] 
7fffb85ff000-7fffb8600000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Aborted 
+0

Un punto y coma me ha causado este error. – tmnol

Respuesta

78

Significa que tiene un error de memoria. Puede estar intentando free un puntero que no fue asignado por malloc (o delete un objeto que no fue creado por new) o puede estar intentando free/delete dicho objeto más de una vez. Puede estar desbordando un búfer o escribiendo en la memoria a la que no debería estar escribiendo, lo que causa daños en el montón.

Cualquier cantidad de errores de programación puede causar este problema. Necesita usar un depurador, obtener un seguimiento y ver qué está haciendo su programa cuando ocurre el error. Si eso falla y usted determina que ha corrompido el montón en algún momento anterior, es posible que sufra una depuración dolorosa (puede no ser muy doloroso si el proyecto es lo suficientemente pequeño como para abordarlo pieza por pieza).

+28

Las herramientas como valgrind son muy útiles para encontrar el origen de estos tipos de errores. Solo asegúrate de compilar con símbolos de depuración. –

+4

[valgrind] (http://www.valgrind.org) es invaluable para resolver estos problemas. –

+2

FYI: Tuve que pasar esto después de redimensionar un std :: vector <> y no era lo suficientemente grande. – Adam27X

6

Necesitamos el código, pero eso generalmente aparece cuando intenta free() memoria desde un puntero que no está asignado. Esto sucede a menudo cuando estás doblemente libre.

12

Encontré el mismo problema, aunque no hice ninguna asignación de memoria dinámica en mi programa, pero estaba accediendo al índice de un vector sin asignarle memoria. Entonces, si es el mismo caso, mejor asigne un poco de memoria usando resize() y luego acceda a los elementos del vector.

+0

¡Muchas gracias! – Hitokage

0

Me encontré con una situación en la que el código eludía la API de STL y escribía en la matriz inseguramente cuando alguien la cambiaba de tamaño. Agregar la afirmación aquí la atrapó:

void Logo::add(const QVector3D &v, const QVector3D &n) 
{ 
GLfloat *p = m_data.data() + m_count; 
*p++ = v.x(); 
*p++ = v.y(); 
*p++ = v.z(); 
*p++ = n.x(); 
*p++ = n.y(); 
*p++ = n.z(); 
m_count += 6; 
Q_ASSERT(m_count <= m_data.size()); 
} 
1

Encontré un error similar. Fue un error novato hecho a toda prisa. Matriz de enteros sin declarar el tamaño int a [] luego intentar acceder a él. El compilador de C++ debería haber detectado ese error fácilmente si estuviera en main. Sin embargo, dado que esta matriz int en particular se declaró dentro de un objeto, se creó al mismo tiempo que mi objeto (se crearon muchos objetos) y el compilador arrojó un error free(): next next invalid (normal). Pensé en 2 explicaciones para esto (por favor infórmeme si alguien sabe más): 1.) Esto dio como resultado que se le asignara memoria aleatoria, pero como esto no era accesible, estaba liberando todas las otras memorias de pila solo intentando para encontrar esto int. 2.) La memoria que requería era prácticamente infinita para un programa y asignarla liberaba todas las demás memorias.

Una simple:

int* a; 
    class foo{ 
    foo(){ 
     for(i=0;i<n;i++) 
      a=new int[i]; 
    } 

resuelto el problema. Pero tomó mucho tiempo intentar depurar esto porque el compilador no pudo "realmente" encontrar el error.

1

Si están tratando de asignar espacio para una matriz de punteros, como

char** my_array_of_strings; // or some array of pointers such as int** or even void** 

entonces usted tendrá que considerar el tamaño palabra (8 bytes en un sistema de 64 bits, 4 bytes en un 32- sistema de bits) cuando se asigna espacio para n punteros. El tamaño de un puntero es el mismo que el de su palabra.

Así, mientras que es posible que desee asignar espacio para n punteros, se les va a necesitar n veces 8 ó 4 (para sistemas de 64 bits o de 32 bits, respectivamente)

Para evitar desbordar su memoria asignada para n elementos de 8 bytes:

my_array_of_strings = (char**) malloc(n * 8); // for 64-bit systems 
my_array_of_strings = (char**) malloc(n * 4); // for 32-bit systems 

Esto devolverá un bloque de n punteros, cada una compuesta de 8 bytes (4 bytes o si está utilizando un sistema de 32 bits)

he notado que Linux te permitirá usar todos los n punteros cuando no hayas compensado para el tamaño de la palabra, pero cuando tratas de liberar esa memoria se da cuenta de su error y da un error bastante repugnante. Y es malo, cuando desborda la memoria asignada, muchos problemas de seguridad están a la espera.

Cuestiones relacionadas