【问题标题】:Valgrind: How to understand exactly when I lose control of a pointer to a memory locationValgrind:当我失去对指向内存位置的指针的控制时,如何准确理解
【发布时间】:2014-03-19 20:13:47
【问题描述】:

我正在使用valgrind's 工具memcheck together with GDB 试图追踪我的C 代码中的内存泄漏。

Valgrind 找到了内存的分配位置,但指向该内存的指针在被释放之前在代码中被扔了很多次。大约 99% 的时间这是正确释放的,但有时不是。 Valgrind 能否以某种方式帮助我找到我失去对该指针的控制权的确切位置,还是我需要查看这个极其复杂的代码才能自己找到它?

编辑:如果 Valgrind 无法向我提供此信息,如果有人能告诉我原因,我会很高兴。我的意思是 Valgrind 确实有关于内存分配位置的信息,如果我用 GDB 停止程序并要求进行泄漏检查,它会知道我是否丢失了指向该内存的指针。为什么 valgrind 不能“观察”这个指针并准确地告诉我什么时候丢失它?

【问题讨论】:

  • 你当然得看代码,但我认为隔离泄漏是 valgrind 所做的。
  • 当该指针被分配给其他东西或发生异常时,查找所有实例。这应该是大多数泄漏的原因。
  • 您可以运行您的程序“valgrind --tool=memcheck --leak-check=yes --db-attach=yes ./a.out”。这样,您的程序将自动附加 gdb。这可能很有用,您可以进行实时调试并检查大部分信息。
  • @tmp 正如我所说我已经在这样做了 =)

标签: c memory-leaks valgrind


【解决方案1】:

Valgrind Omega 工具可以做到这一点:它显示最后一个指向泄漏内存的指针丢失的位置。不幸的是工具is disabled since Valgrind 3.4

exp-Omega,一种实验性的瞬时泄漏检测工具,是 由于缺乏兴趣和维护,在 3.4.0 中禁用,尽管 源代码仍在分发中。来源 代码现已从发行版中删除。

因此,您必须下载并构建 Valgrind 3.3,然后才能运行 valgrind --tool=exp-omega

链接:

【讨论】:

  • 哦,这听起来很有希望。但我不敢相信这么有用的工具被删除了。我总是花很多时间寻找记忆丢失的地方。有时间我会试试这个工具。非常感谢!
  • 无法安装 valgrind 3.3。它说“配置:错误:Valgrind 适用于内核 2.4、2.6”。我认为我的内核是 3.5 :/
  • 您可以修补configure 文件以禁用此检查。幸运的是,Valgrind 在 3.5 上的工作方式与在 2.6 上的工作方式相同。
  • 如果我修补了一些其他检查失败的问题,并且我认为继续修补配置文件以忽略检查可能不会导致某些工作正常
  • 我刚刚发现他们实际上正在讨论是否应该在memcheck中实施Omega:fosdem.org/2014/schedule/event/valgrind_bof但我不知道会议的结果。
猜你喜欢
  • 1970-01-01
  • 2017-06-24
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 2015-07-13
相关资源
最近更新 更多