【问题标题】:Valgrind reports memory 'possibly lost' when using glib data types使用 glib 数据类型时,Valgrind 报告内存“可能丢失”
【发布时间】:2010-11-23 09:41:01
【问题描述】:

我正在使用许多 glib 数据结构(GHashTable、GSList 等)开发一个库。我一直在使用 valgrind 经常检查我的代码是否存在内存泄漏。 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 使用了内存池,正如 here 所建议的那样吗?

我正在使用

  • valgrind-3.5.0
  • glib-2.12.3
  • gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
  • CentOS 5.5 版(最终版)

【问题讨论】:

    标签: c valgrind glib


    【解决方案1】:

    GLib 有一些让 Valgrind 感到困惑的功能。

    一个是内存池(新 glib 中的 g_slice,旧版本中的“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 应该将这些全局分配显示为可访问,而不是丢失。

    【讨论】:

    • 使用 G_SLICE=always-malloc 运行程序显示没有丢失内存,这证实了我怀疑所有(可能的)内存丢失都是由于内存池造成的。感谢 Havoc P 的明确回答。
    • Havoc 你能确认你关于全局变量的陈述对于 GLib 2.32 仍然是正确的吗?谢谢!
    • 是的,例如在 gconvert.c "static GHashTable *iconv_cache" 等(只是一个例子)
    • 在 valgrind 中包含以下选项怎么样? --suppressions=/usr/share/glib-2.0/valgrind/glib.supp
    【解决方案2】:

    glib-2.12 已经很老了。

    尝试获取 glib-2.24,编译并安装它(例如使用 --prefix=/usr/local/glib-2.24),然后使用它来编译您的应用程序。

    如果你还有这个问题,请尝试再次阅读 glib 手册 :)

    【讨论】:

    • 不幸的是,我坚持使用这个版本的 glib,因为我正在开发的软件将在托管服务器上运行,2.12 是默认版本
    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多