【问题标题】:is there a substitute malloc and free library on solaris?solaris 上有替代的 malloc 和免费库吗?
【发布时间】:2011-12-13 16:30:57
【问题描述】:

我试图在 Solaris 操作系统上用 C++/C 编写的非常复杂的遗留系统中查找内存泄漏。这个想法是记录每个 malloc 和 free 然后对日志进行后处理。

我能够编写一个可以正确调用的存根 malloc 和 free 函数。问题是他们除了记录之外什么都不做。结果系统崩溃了

我的问题是:它们是在 solaris 上工作的替代 malloc 库,可以从我的存根 malloc 和免费函数调用吗?

【问题讨论】:

    标签: memory memory-management memory-leaks malloc solaris


    【解决方案1】:

    为什么不直接执行 libumem 的 LD_PRELOAD 并使用 UMEM_DEBUG? umem_debug 的手册页应该为您提供更多信息。

    【讨论】:

      【解决方案2】:

      理想情况下,您应该使用一些内存分析工具,但如果没有相同的工具,您可以尝试按照您的计划实现自己的泄漏检测器。

      您可以通过包装器调用 mallocfree 库版本。

      这是一个您可以尝试实施的方案:

      您的包装器函数应该实现一个功能,其中malloc 的包装器将 malloc 返回的行号、文件名、请求的大小和地址存储在一个链接列表中。
      如何获取文件名和行号?
      提示:使用__FILE____LINE__

      free 包装器应根据列表检查发送的地址以释放,并从链接列表中删除条目。

      在程序结束时,你应该打印这个链表的内容,它会告诉你从分配缓冲区的位置泄漏内存大小、文件名和行号。

      更新:
      如何在没有无限递归的情况下将程序 malloc 调用映射到自己的包装器调用?

      通过巧妙地使用宏!

      #define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__)
      
      void* my_malloc(size_t size, const char *file, int line, const char *func)
      {
      
          void *p = malloc(size);
          printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size);
      
          /*Link List functionality goes in here*/
      
          return p;
      }
      

      【讨论】:

      • 如何通过包装器调用 malloc 和免费库版本?它不会导致无限递归吗?除了“malloc”之外,我不能调用我的包装器。
      • @yigal:更新了答案,它回答了你的问题。
      • 很遗憾,这行不通,因为它需要重新编译所有源代码。由于代码库很大,我做不到——我只能编译其中的一小部分。
      【解决方案3】:

      除了 libumem,我还推荐使用 Solaris Studio dbx,它包含一个内存泄漏检测器 RTC

      【讨论】:

        猜你喜欢
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 2011-03-12
        相关资源
        最近更新 更多