【问题标题】:Valgrind shows memory leaks and now what? R: C() extensionValgrind 显示内存泄漏,现在怎么办? R: C() 扩展
【发布时间】:2014-01-04 10:55:46
【问题描述】:

我编写了一个外部 C 函数,由 R .C() 函数调用。为了检查没有发生内存泄漏,我使用来自 Ubuntu 的 valgrind 进行下一次调用。

R --debugger=valgrind --vanilla < Desktop/eraseme.R

而且我没有收到任何错误。但是我确实收到了我有内存泄漏的通知。

==16347== HEAP SUMMARY:
==16347==     in use at exit: 30,440,904 bytes in 13,097 blocks
==16347==   total heap usage: 29,644 allocs, 16,549 frees, 134,692,871 bytes allocated
==16347== 
==16347== LEAK SUMMARY:
==16347==    definitely lost: 120 bytes in 2 blocks
==16347==    indirectly lost: 480 bytes in 20 blocks
==16347==      possibly lost: 0 bytes in 0 blocks
==16347==    still reachable: 30,440,304 bytes in 13,075 blocks
==16347==         suppressed: 0 bytes in 0 blocks
==16347== Rerun with --leak-check=full to see details of leaked memory

但是我不知道如何找到泄漏的来源。输出显示我应该使用选项--leak-check=full 运行它,但该选项不可用。

我怎样才能找到泄漏的来源?考虑到我正在运行 R 脚本,我必须向 Valgrind 拨打哪个电话?

感谢您的宝贵时间。

编辑:当我说该选项不可用时,我的意思是当我寻找它们时我只有这些选项。

--arch                --help                --min-vsize           --no-restore-history  --silent
--args                --interactive         --no-environ          --no-save             --slave
--debugger-args       --max-nsize           --no-init-file        --no-site-file        --vanilla
--encoding            --max-ppsize          --no-readline         --quiet               --verbose
--file                --max-vsize           --no-restore          --restore             --version
--gui                 --min-nsize           --no-restore-data     --save    

编辑:所以即使C() 函数是正确的,R 确实会显示内存泄漏。

【问题讨论】:

  • Valgrind show memory leaks and now what?:你应该解决这个问题。
  • "但该选项不可用" --- 这是什么意思?当您尝试使用它时会发生什么?
  • --debugger-args=--leak-check=full 怎么样(如果这是有效的语法,否则添加一些引号)?
  • 还与没有您的代码的普通 R 会话进行比较——R 不会完全返回分配的内存,我认为原则上当 R 消失时,所有当前正在使用的内存也会消失。跨度>
  • @Kninnung 是对的,--leak-check 是 valgrind 的一个选项,而不是 R,所以你必须给它 --debugger-args=--leak-check=full

标签: c r memory-leaks


【解决方案1】:

@MartinMorgan 是对的!即使我运行一个只有1+1 的非常愚蠢的脚本,我仍然会得到上述最小的内存泄漏。

【讨论】:

    【解决方案2】:

    只是在 7 年后更新这个问题:

    在 R 中使用 valgrind 记录在“编写 R 扩展”文档中:

    https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Using-valgrind

    命令行语法非常简单,我已将 R 和 valgrind 输出的日志记录添加到不同的文件中:

    R -d "valgrind --tool=memcheck --leak-check=full" --vanilla < my_code.R > r_output.txt 2> valgrind.txt
    

    要获得最大的 valgrind 报告,您可以使用以下选项:

    R -d "valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --track-origins=yes -s" --vanilla -f my_code.R > R_output.txt 2> valgrind.txt
    

    注意:-d = --debugger

    > man R
    ...
          -d, --debugger=NAME
                  Run R through debugger NAME
    
           --debugger-args=ARGS
                  Pass ARGS as arguments to the debugger
    ...
    

    另见:How to redirect Valgrind's output to a file?

    【讨论】:

      猜你喜欢
      • 2011-05-31
      • 2020-03-31
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 2021-06-29
      • 2019-07-17
      • 2019-02-10
      相关资源
      最近更新 更多