2012-06-28 16 views
15

corro Valgrind con los siguientes parámetros:¿Cómo obtener la pila de llamadas completa de Valgrind?

--leak-check=full --show-reachable=yes --leak-resolution=high --num-callers=100 --trace-children=yes 

En pérdidas de memoria de registro, veo algunos mensajes de error con pila completa rastrear hasta principal, pero algunos mensajes parezco siguiente:

==3956== 1,999,140 (68,796 direct, 1,930,344 indirect) bytes in 5,733 blocks are definitely lost in loss record 8,842 of 8,845 
==3956== at 0x4022AB8: malloc (vg_replace_malloc.c:207) 
==3956== 

Cómo ¿Puedo obtener el seguimiento completo de la pila para estos errores?

+0

La última versión publicada de Valgrind solo admite --num-callers hasta 50. Por lo tanto, no está claro qué versión está utilizando. La traza de la pila anterior parece incompleta. Esto podría estar relacionado con la forma en que compila tu aplicación (por ejemplo, la opción -fomit-frame-pointer puede hacer que el seguimiento de la pila sea más difícil de producir) – phd

+0

Bump. (¿Stackoverflow "bump" posts?) Mismo problema. Compilando una aplicación con -g. Muestra posibles fugas de memoria con un rastro de pila que mira desde malloc(), la función que llama malloc(), y luego main(), omitiendo todo lo que está en medio, incluidas las funciones dentro del mismo archivo que main(). ?? Veo ejemplos en línea que no tienen este límite de 3 niveles de pila ... ?? ¿Algunas ideas? – Samuel

+0

Estoy usando valgrind 3.8.1 en Ubuntu 13.10 y veo rastros de pila que no contienen todas las llamadas intermedias. Sin optimización al compilar con gcc (o tal vez necesito -Og o algo así ...) – thoni56

Respuesta

14

Obtener el seguimiento completo de la pila requerirá símbolos de depuración para todas las bibliotecas/ejecutables que puedan estar involucradas en una fuga (y dentro de los límites establecidos por --num-callers).

Si está construyendo cualquiera de ellos usted mismo, debe especificar el indicador -g en gcc (o el indicador correspondiente en cualquier otro compilador).

Tenga en cuenta que no es infalible, y ocasionalmente puede perder fugas o no puede proporcionar rastros de pila completos (especialmente si está usando subprocesos, o implementaciones complicadas class).

Para las bibliotecas sin información de depuración, el seguimiento de la pila se detendrá en esa biblioteca.

Para una herramienta gratuita, es muy buena en lo que hace, pero hay una razón por la que lugares como IBM pueden vender perfiles de memoria por mucho dinero.

+6

Gracias, en mi caso solo tuve que ajustar la opción --num-callers. El valor predeterminado parece ser 12, que es bastante bajo para el STL y similares. – cib

Cuestiones relacionadas