【问题标题】:Memory leak when C program ran from bash script当 C 程序从 bash 脚本运行时内存泄漏
【发布时间】:2018-07-10 13:40:02
【问题描述】:

我有一个 C 程序,它接受各种命令行参数,即

./Coupled arg1 argv2

当我用 valgrind 作为

运行它时
valgrind ./Coupled arg1 arg2

我没有发现内存泄漏。但是当我使用一个名为 run 的 bash 脚本时,格式为

arg1=thing1
arg2=thing2

./Coupled $thing1 $thing2

然后运行

valgrind ./run

我得到了很多仍然可以访问的内存泄漏。我已经读到仍然可以访问的内存泄漏不是一个大问题,但我很想知道为什么会这样?当使用--leak-check=full --show-leak-kinds=all 标志运行 valgrind 时,输出示例位(完整的 valgrind 输出有很多页)

==4518== 1 bytes in 1 blocks are still reachable in loss record 1 of 269
==4518==    at 0x4C29BE3: malloc (vg_replace_malloc.c:299)
==4518==    by 0x46A3DA: xmalloc (in /usr/bin/bash)
==4518==    by 0x437219: make_variable_value (in /usr/bin/bash)
==4518==    by 0x438230: ??? (in /usr/bin/bash)
==4518==    by 0x43A35E: initialize_shell_variables (in /usr/bin/bash)
==4518==    by 0x41DD92: ??? (in /usr/bin/bash)
==4518==    by 0x41C482: main (in /usr/bin/bash)

【问题讨论】:

  • 这个问题没有源代码有什么意义?
  • @EugeneSh。 C 代码本身似乎没有问题,正如我所说,它运行时没有任何泄漏,问题出在 bash 脚本而不是 C 代码中。此外,C 代码有几千行长,因为它似乎没有任何问题,所以我不知道要包含什么。

标签: c bash memory-leaks


【解决方案1】:

valgrind ./run 将调试 shell 而不是您的程序。

看看输出,看看它是如何提到的(例如)

==4518== by 0x41C482: main (in /usr/bin/bash)

[强调我的]

如果你想调试你的程序,你需要运行valgrindin脚本:

arg1=thing1
arg2=thing2

valgrind ./Coupled $thing1 $thing2

【讨论】:

  • 那么在这种情况下预期会发生可达到的内存泄漏吗?只是担心它是 bash 编程中的一个微妙之处,因为我知道的很少!不过,与 valgrind 运行的区别是有道理的,谢谢!
  • @DanielJ 除非您想调试 Bash 并将错误报告发送给 Bash 维护人员,否则无需担心。 Bash 很复杂,因此它包含错误。也有可能一些被像我们这样的外人视为错误的事情真的不是,而且这些报告是误报。更重要的是,在 Bash 上运行 Valgrind 并没有说明您的程序任何内容
猜你喜欢
  • 2018-06-21
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2021-04-17
  • 1970-01-01
  • 2010-10-13
相关资源
最近更新 更多