是否仍然可以到达" VALGRIND内存泄漏(Linux)与SOLARIS上的PRSTAT内存增长有关吗?

时间:2011-12-03 06:59:31

标签: c valgrind

我正在使用Valgrind检查我编写的C应用程序中的泄漏。

我正在使用第三方图书馆......但我不能100%确定问题是否真的只存在于他们身上。如果我通过我的代码运行10条消息,我在Linux上得到以下信息:

==12460== LEAK SUMMARY:
==12460==    definitely lost: 70,794 bytes in 11 blocks
==12460==    indirectly lost: 0 bytes in 0 blocks
==12460==      possibly lost: 69,960 bytes in 19 blocks
==12460==    still reachable: 52,095 bytes in 33 blocks
==12460==         suppressed: 0 bytes in 0 blocks

如果我通过我的代码运行100条消息,我会得到:

==12811== LEAK SUMMARY:
==12811==    definitely lost: 70,794 bytes in 11 blocks
==12811==    indirectly lost: 0 bytes in 0 blocks
==12811==      possibly lost: 69,960 bytes in 19 blocks
==12811==    still reachable: 61,795 bytes in 133 blocks
==12811==         suppressed: 0 bytes in 0 blocks

所以你可以看到“仍然可以访问”是唯一一个真正在这里增长的人 ...这与我将这段代码带到Solaris时我看到PRSTAT下的SIZE字段这一事实有关一段时间后成长?我认为“仍然可达”仍然是“某种内存泄漏”?

我的Valgrind日志中“仍然可以访问”的示例如下:

==12811== 848 bytes in 1 blocks are still reachable in loss record 34 of 48
==12811==    at 0x4A067BA: malloc (vg_replace_malloc.c:263)
==12811==    by 0x656F1A7: xppInitialize (in /opt/mqm/lib64/libmqmcs.so)
==12811==    by 0x6538802: InitProcessInitialisation (in /opt/mqm/lib64/libmqmcs.so)
==12811==    by 0x653A3D4: xcsInitializeEx (in /opt/mqm/lib64/libmqmcs.so)
==12811==    by 0x653AF94: xcsInitialize (in /opt/mqm/lib64/libmqmcs.so)
==12811==    by 0x6250BAC: zstMQCONNX (in /opt/mqm/lib64/libmqz.so)
==12811==    by 0x60B1605: MQCONNX (in /opt/mqm/lib64/libmqm.so)
==12811==    by 0x585CEBA: wmq_receiver_initialize (wmq_receiver.c:18)
==12811==    by 0x4E10D58: wmq_receiver_proxy_initialize (wmq_receiver_proxy.c:17)
==12811==    by 0x402D02: initialiseWMQReceiverProxy (test_outbound.c:296)
==12811==    by 0x4027E8: outboundThreadMainLoop (test_outbound.c:209)
==12811==    by 0x37EA2077E0: start_thread (in /lib64/libpthread-2.12.so)

但上面是第三方IBM库?但是我不能相信IBM(对于Websphere MQ)会因为已经使用多年而在lib中泄漏......我可能会在这里遗漏一些东西吗?

有什么方法可以更好地追踪并修复这些“仍然可以到达”的泄漏?我认为我是正确的说这可能是我在移植应用程序后看到Solaris逐渐增加内存的原因......

感谢您的帮助; - )

林顿

2 个答案:

答案 0 :(得分:2)

“仍然可以访问”通常意味着代码具有一些静态(或线程本地)指针变量,该变量使用malloc&该部分在第三方库中增长可能表明该库不时地扩展其缓冲区以应对不断增长的请求。但由于似乎没有额外的“明确丢失”似乎很好地做到了这一点,例如使用realloc

在你的情况下,当你强调图书馆时,你必须看看这是否会进一步增加。最后你可以为该库写一个“supression”文件,所以valgrind会忽略这些。在现代Linux发行版中,您已经拥有了一些标准库,例如

根据我的个人喜好,最终和可能丢失的部分会让我更加担心,我会先清理它们。如果valgrind设法为您的应用程序的每个 free 捕获malloc,则只能确保根本没有泄漏。

答案 1 :(得分:0)

“仍然可以访问”意味着在代码中的某些地方存在指向那些已分配块的有效指针。所以它不是传统的泄漏 - 从理论上讲,记忆仍然可以被释放。您是正确的,这将在prstat指标的SIZE中进行说明。

运行您的应用程序的时间更长,邮件更多。如果它稳定下来,那么它很可能是好的 - 例如,库可以构建缓存(内存池,网络缓冲区)以帮助提高性能。