2

有谁知道在使用 GLib 和 GDBus 时检测内存泄漏的任何工具或技术?我对使用这两个库都比较陌生,并且相信我正确使用了 API,但是如果有一个工具可以用来确认我正在正确清理我的资源,那就太好了。我已经通过各种 lint 类型的程序运行了我的代码,但这些程序可能没有检测到任何抽象到库中的东西。

我正在寻找专门针对 GLib 或 GDBus 的工具,还是我可以针对这些库进行检测的工具?也许我什至可以为 GLib 或 GDBus 设置一些编译时标志?

4

1 回答 1

3

我最近刚刚用 glib/gdbus/libsoup 做了一些巫术,根据我的经验valgrindvalgrind/ massif做得很好(虽然不是真正的静态分析,而是运行时分析)。


valgrind(即使对 g_slice_alloc/g_slice_new 也使用 malloc,使 valgrind 不那么混乱,gc 友好使所有 glib 内部指针无效)

G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind ./yourapp

输出中仍然会有误报——使用抑制文件来隐藏它们。


massif(使用常驻模块来防止大量噪音)

G_DEBUG=resident-modules valgrind --tool=massif --depth=10 --max-snapshots=1000 --alloc-fn=g_malloc --alloc-fn=g_realloc --alloc-fn=g_try_malloc          --alloc-fn=g_malloc0 --alloc-fn=g_mem_chunk_alloc --threshold=0.01 ./yourapp --your --app --options

使用一些可视化工具使地块输出可读(几个 MB 日志) massif-visualizer 做得很好

请记住,glib 有几 MB 静态分配的东西(所有 GObject 类型的类)


如果您需要自己调试库,则无法使用调试标志 (-g) 编译它们

于 2013-12-10T08:26:01.100 回答