c - Solaris LIBUMEM : Get "libmapmalloc.so.1 not found" when C application executes SUBPROCESS?

标签 c memory-leaks solaris libumem

我有一个在 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: fatal: libmapmalloc.so.1: 没有这样的文件或目录

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

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

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

注意:我也尝试过将变量导出到整个环境,但仍然没有成功

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

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

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

感谢您的帮助

林顿

最佳答案

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

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

您的说法是正确的,当(子)进程结束时,其所有内存分配都会被释放。

关于c - Solaris LIBUMEM : Get "libmapmalloc.so.1 not found" when C application executes SUBPROCESS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8284156/

相关文章:

c - 不明白 tsearch 返回指针是如何工作的

c - 在什么条件下管道读取是原子的?

c++ - 谷歌模拟全局模拟对象内存泄漏

ios - 调整 UIImage 大小时内存泄漏

unix - 什么进程正在监听 Solaris 上的某个端口?

c++ - 为什么 cout 不打印 extern "C"变量?

cs50 pset5 拼写分割,内存错误

c - 文件的多线程

c++ - 长时间运行的 C++ 应用程序中的内存泄漏

c - 如何在 Solaris 上设置输入队列的动态大小?