2013-06-01 31 views
3

我试图检查我的代码中的内存泄漏,并且valgrind显示了很多错误。因为我以前从未使用valgrind,所以我需要帮助。 首先,我正在关注默认的gtk调用。 作为编码,内存从mkbib.c的行号140,但行号140泄露的只是由valgrind显示的内存泄漏到gtk初始化调用

gtk_init(&argc, &argv); 

我用

G_SLICE=always-malloc G_DEBUG=gc-friendly valgrind --tool=memcheck 
--leak-check=full --leak-resolution=high --num-callers=20 
--log-file=vgdump --suppressions=gtk.suppression ./mkbib 

器伴随gtk.suppression从valgrind-gnome Live

==28420== 16 bytes in 1 blocks are definitely lost in loss record 2,413 of 10,955 
==28420== at 0x4A0887C: malloc (vg_replace_malloc.c:270) 
==28420== by 0x310CA4D68E: g_malloc (in /usr/lib64/libglib-2.0.so.0.3400.2) 
==28420== by 0x311C611176: ??? (in /usr/lib64/libatk-bridge-2.0.so.0.0.0) 
==28420== by 0x311C60C19D: atk_bridge_adaptor_init (in /usr/lib64/libatk-bridge-2.0.so.0.0.0) 
==28420== by 0x311D50257B: ??? (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38D6FA: ??? (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x310CA52FB6: g_option_context_parse (in /usr/lib64/libglib-2.0.so.0.3400.2) 
==28420== by 0x311D38DBCD: gtk_parse_args (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38DC28: gtk_init_check (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38DC58: gtk_init (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x403F65: main (mkbib.c:140) 
==28420== 
==28420== 16 bytes in 1 blocks are definitely lost in loss record 2,414 of 10,955 
==28420== at 0x4A0887C: malloc (vg_replace_malloc.c:270) 
==28420== by 0x310CA4D68E: g_malloc (in /usr/lib64/libglib-2.0.so.0.3400.2) 
==28420== by 0x311C611176: ??? (in /usr/lib64/libatk-bridge-2.0.so.0.0.0) 
==28420== by 0x311C60C1DD: atk_bridge_adaptor_init (in /usr/lib64/libatk-bridge-2.0.so.0.0.0) 
==28420== by 0x311D50257B: ??? (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38D6FA: ??? (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x310CA52FB6: g_option_context_parse (in /usr/lib64/libglib-2.0.so.0.3400.2) 
==28420== by 0x311D38DBCD: gtk_parse_args (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38DC28: gtk_init_check (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38DC58: gtk_init (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x403F65: main (mkbib.c:140) 
==28420== 
==28420== 24 bytes in 1 blocks are possibly lost in loss record 3,468 of 10,955 
==28420== at 0x4A0887C: malloc (vg_replace_malloc.c:270) 
==28420== by 0x310CA4D68E: g_malloc (in /usr/lib64/libglib-2.0.so.0.3400.2) 
==28420== by 0x310CA63F65: g_memdup (in /usr/lib64/libglib-2.0.so.0.3400.2) 
==28420== by 0x310D22D274: ??? (in /usr/lib64/libgobject-2.0.so.0.3400.2) 
==28420== by 0x310D22DFCC: g_type_class_ref (in /usr/lib64/libgobject-2.0.so.0.3400.2) 
==28420== by 0x311D5022C7: ??? (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311A6154C8: atk_add_focus_tracker (in /usr/lib64/libatk-1.0.so.0.20609.1) 
==28420== by 0x311D502567: ??? (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38D6FA: ??? (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x310CA52FB6: g_option_context_parse (in /usr/lib64/libglib-2.0.so.0.3400.2) 
==28420== by 0x311D38DBCD: gtk_parse_args (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38DC28: gtk_init_check (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38DC58: gtk_init (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x403F65: main (mkbib.c:140) 
==28420== 
==28420== 24 bytes in 1 blocks are possibly lost in loss record 3,469 of 10,955 
==28420== at 0x4A06B6F: calloc (vg_replace_malloc.c:593) 
==28420== by 0x310CA4D6E6: g_malloc0 (in /usr/lib64/libglib-2.0.so.0.3400.2) 
==28420== by 0x310D22DF00: g_type_class_ref (in /usr/lib64/libgobject-2.0.so.0.3400.2) 
==28420== by 0x310D22DD4E: g_type_class_ref (in /usr/lib64/libgobject-2.0.so.0.3400.2) 
==28420== by 0x310D21E7BF: g_param_spec_flags (in /usr/lib64/libgobject-2.0.so.0.3400.2) 
==28420== by 0x311D4C27BB: ??? (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x310D22E0B5: g_type_class_ref (in /usr/lib64/libgobject-2.0.so.0.3400.2) 
==28420== by 0x311D5022C7: ??? (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311A6154C8: atk_add_focus_tracker (in /usr/lib64/libatk-1.0.so.0.20609.1) 
==28420== by 0x311D502567: ??? (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38D6FA: ??? (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x310CA52FB6: g_option_context_parse (in /usr/lib64/libglib-2.0.so.0.3400.2) 
==28420== by 0x311D38DBCD: gtk_parse_args (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38DC28: gtk_init_check (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x311D38DC58: gtk_init (in /usr/lib64/libgtk-3.so.0.600.4) 
==28420== by 0x403F65: main (mkbib.c:140) 

我发现一些讨论,valgrind不好检测gtk中的内存泄漏。这是这种情况之一,我应该忽略?或者我错过了什么?

我参与系统:

  1. gtk3-devel的-3.6.4-1.fc18.x86_64
  2. 的valgrind-3.8.1-9.fc18.x86_64
  3. 海合会(GCC)4.7 .2 20121109

回答

1

暂时你应该专注于在代码中明确检测到的泄漏。 Valgrind经常发现你无法修改的外部组件泄漏,甚至商业库。您可以参考文档忽略文件,他们suppres从某些库来错误的输出: http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress

+0

感谢您的评论。但正如你所看到的,我已经使用了gtk本身的建议。但那些泄漏仍然存在。 – BaRud

+0

我看了一下压缩文件,虽然我不是专家,但我认为你的错误不在其中。它没有包含正确库的行,所有行都包含正确的函数,但在另一个库中。也许你可以生成另一个压缩文件或添加所需的压缩到现有的压缩文件。 – AlphaOne

1

尝试修改抑制文件,以便更为通用,节录例如: ... obj:/usr/lib64/libgtk* (issue seems to apply to any gtk version, including gtk-2) fun:g_option_context_parse fun:gtk_parse_args (or could just use "...") fun:gtk_init* (also applies to gtk_init_check)