c valgrind glib

c - Valgrind informa sobre la memoria ''posiblemente perdida'' al usar tipos de datos glib



(2)

GLib tiene algunas características que confunden a Valgrind.

Una es la agrupación de memoria (g_slice en glib más reciente, "mem chunks" en más antiguo). Estos son asignadores especializados que se utilizan para objetos pequeños, como los nodos de lista. Puede usar esto para deshabilitar el asignador de segmentos: G_SLICE=always-malloc valgrind myprogram

Un segundo problema es que a veces GLib evitaría inicializar la nueva memoria o mantendría punteros muertos en segmentos / trozos liberados. Puedes arreglar esto con: G_DEBUG=gc-friendly valgrind myprogram

Así que juntos, por supuesto: G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind myprogram

Un tercer problema es que GLib tiene variables globales que simplemente nunca se liberan sino que se consideran un estado permanente del programa. Por ejemplo, los GType registrados nunca se descargan, y algunos otros. Esto no es solucionable, pero valgrind debería mostrar estas asignaciones globales como alcanzables, en lugar de como perdidas.

Estoy desarrollando una biblioteca utilizando una serie de estructuras de datos glib (GHashTable, GSList, etc.). He estado revisando mi código con frecuencia en busca de pérdidas de memoria usando valgrind. La mayoría de los problemas que señala Valgrind son bastante fáciles de solucionar, sin embargo, hay algunos que no puedo entender.

Todos estos son reportados como ''posiblemente perdidos''.

En la parte superior de la pila de valgrind, siempre encuentro las mismas 4 bibliotecas:

==29997== 1,512 bytes in 3 blocks are possibly lost in loss record 24 of 25 ==29997== at 0x4004B11: memalign (vg_replace_malloc.c:532) ==29997== by 0x4004B6B: posix_memalign (vg_replace_malloc.c:660) ==29997== by 0x5E9AC4: ??? (in /lib/libglib-2.0.so.0.1200.3) ==29997== by 0x5EA4FE: g_slice_alloc (in /lib/libglib-2.0.so.0.1200.3)

Más abajo en la pila de llamadas, siempre hay una llamada a una función glib, como g_key_file_new (), g_slist_prepend (), g_strsplit (), g_key_file_load_from_file (), g_file_get_contents ().

Mis preguntas son:

  • ¿Alguien ha encontrado esto y ha encontrado una manera de evitarlo?

  • ¿O es esto algo que puedo ignorar? ¿Se debe a glib usando pools de memoria, como se sugiere here ?

estoy usando

  • valgrind-3.5.0
  • glib-2.12.3
  • gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
  • CentOS release 5.5 (final)

glib-2.12 es bastante viejo.

Intente obtener glib-2.24, compílelo e instálelo (con --prefix = / usr / local / glib-2.24 por ejemplo) luego utilícelo para compilar su aplicación.

Si todavía tienes esto, intenta leer el manual de glib otra vez :)