【问题标题】:How to know unfreed memory in a function?如何知道函数中未释放的内存?
【发布时间】:2019-10-18 15:30:30
【问题描述】:

我知道可以使用 Valgrind 来查找整个程序执行过程中的内存泄漏。但现在我想在函数执行期间跟踪未释放的内存。该函数只是程序的一部分,但它非常复杂并且包含对其他函数的调用。该程序是 Valgrind 干净的。

有没有办法做到这一点?谢谢。

【问题讨论】:

  • 建议添加语言和编译器标签
  • 我们不擅长读心,贴代码
  • @user3629249 这是一个一般性问题,与特定代码无关。举一个 C 的例子, int main() { foo();酒吧(); }。我想知道“执行 foo() 后,是否在 foo() 中分配了未释放的内存,假设整个程序是无泄漏的,也假设 foo() 在一个大的复杂库中。

标签: c gcc memory-leaks valgrind


【解决方案1】:

如果一个程序没有任何内存泄漏,这意味着它的所有函数都没有内存泄漏。如果您运行程序,验证该函数已针对所有相关用例执行,并且 Valgrind 没有发现任何泄漏,则该函数不会有任何泄漏。

如果您只想检测函数中的泄漏,您只需为它编写一个单元测试并在 valgrind 下运行它。这使得使用外部程序接口可能难以覆盖的某些情况更容易覆盖。

当然 valgrind 是动态分析,并且只能检查在测试运行期间实际发生的泄漏,因此您必须注意获得良好的覆盖率。它还抑制了在某些地方仍然存在看起来像是指向内存的有效指针的泄漏。这是因为许多库在关闭时不会费心释放内存(这是正确的;系统无论如何都必须清理它),但有时可能会导致误报。静态分析在这方面会更好,但我不知道有什么好的方法用于此目的——静态检测无效的内存管理真的很困难(即使 Rust 也可以可靠地防止 use-after-free,但只有大多数泄漏,而不是全部)。

【讨论】:

  • 感谢您的回复。一位用户说,我们图书馆的一个例程会定期增加他们应用程序的 RSS(驻留集大小),从而可能导致内存不足。但是,我们库的内存分配器跟踪器在此例程中报告没有未释放的内存。应用程序和我们的库都非常复杂,很难分离出单元测试。所以我需要一个 valgrind 工具来检测用户指定的代码段中的“内存泄漏”(实际上是未释放的内存,因为应用程序中没有泄漏)。许多分析工具都有 API 供用户仅分析一段代码。希望 valgrind 能做到。
猜你喜欢
  • 2013-10-10
  • 1970-01-01
  • 2010-12-30
  • 2020-07-22
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多