【问题标题】:Valgrind showing over 200 allocs for a hello world program on OS X?Valgrind 为 OS X 上的 hello world 程序显示了 200 多个分配?
【发布时间】:2016-09-10 03:19:14
【问题描述】:

我今天在一台 Linux 机器上用 C 语言编写了一个链表,并且所有内容都在 Valgrind 中进行了检查。然后我在家里的 OS X 上运行了相同的测试(少量推送,然后删除列表)并获得了疯狂数量的分配。

==4344== HEAP SUMMARY:
==4344==     in use at exit: 26,262 bytes in 187 blocks
==4344==   total heap usage: 267 allocs, 80 frees, 32,374 bytes allocated
==4344== 
==4344== LEAK SUMMARY:
==4344==    definitely lost: 0 bytes in 0 blocks
==4344==    indirectly lost: 0 bytes in 0 blocks
==4344==      possibly lost: 0 bytes in 0 blocks
==4344==    still reachable: 0 bytes in 0 blocks
==4344==         suppressed: 26,262 bytes in 187 blocks
==4344== 
==4344== For counts of detected and suppressed errors, rerun with: -v
==4344== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

我知道代码很好,没有任何泄漏。所以我只是注释掉了列表测试并在主要编译时只使用了printf("test\n");,它显示了 263 个分配和 76 个空闲(我在列表测试中有 4 个有意分配)。为什么我在 OS X 上得到这么多分配?这只是操作系统所做的吗?我不明白为什么我刚做 printf 时会有 263 个分配...

【问题讨论】:

    标签: c macos valgrind


    【解决方案1】:

    OS X 的架构非常糟糕。因为libdllibdyldlibmlibc等一些库被“打包”到libSystem中,所以在加载库的时候都会初始化。其中大部分来自dyld。 Dyld 是用 C 和 C++ 编写的,这就是为什么 C++ 部分可能会推高 allocs 的数量。

    这只是 Apple 的事情,而不是 OS X 的事情。我写了一个备用的 C 库。它没有很多“不需要的分配”。


    此外,分配是由打开FILE *s 引起的。请注意,运行时会初始化 3 个流(stdinstdoutstderr)。

    【讨论】:

    • 至少在 Linux 上,stdio-streams(包括stdin/stdoutmmap() 它们在第一次使用时缓冲,而不是在程序启动时。
    【解决方案2】:

    目前正在积极开发对 OS X 的 Valgrind 支持。您最好的方法是确保您使用的是 SVN 主干构建,并经常更新。

    Valgrind 向您报告的错误存在于 OS X 系统库中。这些不是你的程序的错,而是因为即使是简单的程序,包括这些系统库 Valgrind 也会继续使用它们。 Valgrind 主干中的抑制功能不断更新以捕捉这些问题,让您能够专注于代码中可能存在的真正问题。

    如果您还没有使用 Valgrind 主干,以下命令将允许您使用:

    svn co svn://svn.valgrind.org/valgrind/trunk valgrind
    cd valgrind
    ./autogen.sh
    ./configure
    make -j4
    sudo make install
    

    全面披露:我是为支持 OS X 10.11 贡献补丁的 Valgrind 开发人员之一

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      相关资源
      最近更新 更多