Valgrind сообщает о возможной потере памяти при использовании типов данных glib - PullRequest
22 голосов
/ 23 ноября 2010

Я занимаюсь разработкой библиотеки с использованием ряда структур glib (GHashTable, GSList и т. Д.). Я часто проверял свой код на предмет утечек памяти, используя valgrind. Большинство проблем, на которые указывает Вэлгринд, довольно легко исправить, однако есть некоторые, которые я не могу понять.

Все они отмечены как «возможно потерянные».

В верхней части трассировки стека valgrind я всегда нахожу одни и те же 4 библиотеки:

==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)

Далее в стеке вызовов всегда есть вызов функции glib, такой как g_key_file_new (), g_slist_prepend (), g_strsplit (), g_key_file_load_from_file (), g_file_get_contents ().

Мои вопросы:

  • Кто-нибудь сталкивался с этим и нашел способ обойти это?

  • Или это то, что я могу игнорировать? Это из-за того, что glib использует пулы памяти, как предложено здесь ?

Я использую

  • valgrind-3.5.0
  • glib-2.12.3
  • gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
  • CentOS выпуск 5.5 (финал)

Ответы [ 2 ]

34 голосов
/ 23 ноября 2010

GLib имеет несколько функций, которые запутывают Valgrind.

Один из них - пулы памяти (g_slice в более новом glib, «mem chunks» в более старом).Это специализированные распределители, используемые для небольших объектов, таких как узлы списка.Вы можете использовать это для отключения распределителя слайсов: G_SLICE=always-malloc valgrind myprogram

Вторая проблема заключается в том, что иногда GLib избегает инициализации новой памяти или сохраняет мертвые указатели в освобожденных фрагментах / порциях.Это можно исправить с помощью: G_DEBUG=gc-friendly valgrind myprogram

Итак, вместе: G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind myprogram

Третья проблема заключается в том, что GLib имеет глобальные переменные, которые просто никогда не освобождаются, но считаются постоянным состоянием программы.Например зарегистрированные GType никогда не выгружаются и некоторые другие.Это невозможно исправить, но valgrind должен показывать эти глобальные распределения как достижимые, а не потерянные.

0 голосов
/ 23 ноября 2010

glib-2.12 довольно старый.

Попробуйте получить glib-2.24, скомпилируйте и установите его (например, с - префиксом = / usr / local / glib-2.24 ), затемиспользуйте его для компиляции приложения.

Если у вас все еще есть это, попробуйте снова прочитать руководство по glib:)

...