2012-01-31 12 views
6

mi aplicación de impresión varias lineas como:Cómo trazar "tcmalloc: gran alloc ...."

tcmalloc: large alloc 4294488064 bytes == 0x2b968d8000 @ 0x727432 0x727302 0x727a58 0x75a07d 0x574beb 0x585756 0x5575df 0x5717db 0x57108f 0x58078c 0x302b80610a 
tcmalloc: large alloc 4294488064 bytes == 0x2c97063000 @ 0x727432 0x727302 0x727a58 0x75a07d 0x574beb 0x585756 0x5575df 0x5717db 0x57108f 0x58078c 0x302b80610a 
tcmalloc: large alloc 4294488064 bytes == 0x2b968d8000 @ 0x727432 0x727302 0x727a58 0x75a07d 0x574beb 0x585756 0x5575df 0x5717db 0x57108f 0x58078c 0x302b80610a 

¿de dónde viene este mensaje viene de? ¿significa que mi aplicación tiene algunos errores o pérdida de memoria? ¿cómo puedo rastrear la causa raíz?

+3

para rastrear la dirección de la memoria a una línea en su código, use la herramienta de línea de comandos addr2line .. úselo como addr2line -e luego presione intro y luego pegue una dirección y presione enter. –

+1

Gracias. en este caso, pego la dirección al final de las líneas, pero obtengo un "??: 0" – Shawn

+1

que tiene que compilar usando la opción -g. –

Respuesta

7

Ver http://code.google.com/p/gperftools/source/browse/trunk/src/tcmalloc.cc?r=80&redir=1 línea 843

Dependiendo de la aplicación - la gran distribución puede o no puede ser un error.

En cualquier caso - la parte después de la marca @ es una traza de la pila y se puede utilizar para localizar la fuente del mensaje

El número de repetición (4294488064 que parece ser igual a 4G-479232 o 0x100000000- 0x75000) me hace sospechar que la llamada de asignación original obtuvo un valor de signo negativo y lo usó como un valor sin signo.

+2

gracias, eso es muy útil. el error es como dijiste, causado por la mezcla de uso de valores sin signo y con signo – Shawn

1

Si todavía tiene el proceso en marcha o se haya podido núcleo lo descarga (kill -ABRT), entonces debería ser capaz de conectar gdb y ejecuta el comando info symbol <address> (<address> es uno de esos números hexadecimales después @ en el mensaje de error: 0x727432 ...)

En mi caso, fue un error auténtico.