0

我有一个在 Linux、Solaris 和 AIX 上运行的 C 应用程序。我使用了 Totalview 的 MemoryScape 之类的工具来追踪 Linux 上的内存泄漏,而且它是 100% 干净的。但是,我注意到 Solaris 上有一个小漏洞。

所以我一直在 Solaris 上使用“libumem”来尝试查找泄漏。

我的应用程序要么调用“用户出口”(通过子进程调用),要么不调用。

因此,如果我在没有用户退出的情况下运行应用程序(因此没有子进程调用),那么 libumem 可以 100% 工作......而且我仍然没有看到任何泄漏......

LD_PRELOAD=libumem.so UMEM_DEBUG=audit ./myapplication config.ini

但是当我打开用户出口调用以便主应用程序调用子进程时,我会在运行时由子进程将以下内容打印到 STDOUT:

ld.so.1:userexit_proxy:致命:libmapmalloc.so.1:没有这样的文件或目录

请注意,如果我使用“libumem”,那么应用程序会 100% 运行......(仍然只是很小的内存泄漏)

现在我的应用程序是用 64 位编译的,我注意到 /usr/lib/libmapmalloc.so.1 是 32 位的,但这应该没什么区别......

知道如何在也调用子进程的应用程序上使用 libumem 吗?

注意:我也尝试将变量导出到整个环境,仍然没有运气

导出 LD_PRELOAD=libumem.so 导出 UMEM_DEBUG=审计

另外,如果我错了,请纠正我,但是如果子进程完成,那么该子进程中的任何“泄漏内存”都会自动释放,对吗?所以我可以假设 Solaris 上没有泄漏来自子进程调用?

在这方面的任何帮助将不胜感激

谢谢您的帮助

林顿

4

1 回答 1

0

当使用 dlerror 的代码错误地假定它在 dlopen 成功时返回非空值时,已经观察到了这种行为(请参阅此邮件:indiana Discussion。)我将首先跟踪您的应用程序以查看这些函数是否被调用以及如何调用。

/usr/lib/libmapmalloc.so.1 确实是 32 位,但如果您的应用程序是 64 位,它使用类似 /usr/lib/amd64/libmapmalloc.so 或类似的东西。

您说得对,当一个(子)进程结束时,它的所有内存分配都被释放。

于 2011-11-27T09:51:14.667 回答