【问题标题】:Memory Leaks in C (MacOS)C 中的内存泄漏 (MacOS)
【发布时间】:2019-09-19 14:43:06
【问题描述】:

我是一名 C 编程学生,试图找到一种方法来检测 MacOs Mojave 上的内存泄漏。

我知道 Valgrind 的存在,但它不支持当前的 MacOs 版本。安装 Apple 命令行工具后,我尝试使用泄漏工具运行我的 C 程序,但它不起作用...运行这个非常简单的 C 程序:

#include <stdio.h>

int main(int argc, char const *argv[]) {
  printf("Hello World\n");
  return 0;
}

像这样:

leaks ./a.out

这是输出:

leaks[875]: [fatal] unable to read input graph: The data 
 couldn’t be read because it isn’t in the correct format.

我不明白为什么会发生这种情况...如何使用泄漏工具?

【问题讨论】:

  • 也许this 有帮助
  • 什么是 iprofiler?

标签: c macos memory-leaks


【解决方案1】:

与 Valgrind 不同,leaks 命令旨在在执行“leaks”命令时发现已经运行的代码中的内存泄漏。

为了获得您正在寻找的功能,您需要以下命令:

leaks -atExit -- ./a.out

【讨论】:

    【解决方案2】:

    我不确定这是否有帮助,但如果 C 程序的状态为运行,“泄漏”将可用

    #include <stdio.h>
    
    int main(int argc, char const *argv[]) {
      printf("Hello World\n");
      getchar(); // just add to sleep
      return 0;
    }
    

    在上面运行,然后在另一个终端运行下面​​

    leaks a.out
    

    您可以显示相关消息

    Process:         a.out [8724]
    Path:            /Users/USER/Documents/*/a.out
    Load Address:    0x1078f2000
    Identifier:      a.out
    Version:         ???
    Code Type:       X86-64
    Parent Process:  bash [7876]
    ...
    

    在本例中也可以使用 [PID]

    leaks 8724
    

    这是检测内存泄漏的示例代码,

    #include <stdio.h>
    
    void test()
    {
      char* pTmp = (char*)malloc(sizeof(char)*1);
    }
    
    int main(int argc, char const *argv[]) {
      printf("Hello World\n");
      test();
      getchar();
      return 0;
    }
    

    【讨论】:

    • 我不明白该怎么做...你能更明确一点吗?
    • @andrefcptcc34 打开两个终端,第一个运行 ./a.out(包括 getchar() 用于运行状态),然后移动到另一个终端,运行泄漏 a.out
    • @andrefcptcc34 很简单,只运行“top”,记住运行中的一个pid,然后运行leaks [PID],像这样:leaks 8888
    • 好的,它成功了...但是为什么会这样呢?一开始不应该运行吗?使用leaks ./a.out?
    • @andrefcptcc34 我尝试了“leaks ./a.out” + 一些选项,但得到了相同的输出消息,似乎泄漏只在进程级别工作,而不是代码级别
    【解决方案3】:

    试试这个

    #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;
    }
    

    【讨论】:

    • 问题不在于C程序...我不是在问如何分配内存,这只是一个简单的例子。
    • 哦,我明白了,我采取了另一种方式
    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 2010-12-20
    • 2010-10-11
    • 1970-01-01
    • 2016-01-27
    • 2010-11-11
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多