2009-08-19 76 views
2

当您使用某种“工具”(例如WinDbg,GlowCode或甚至整合的Visual C++泄漏记者)查找内存泄漏时,可以报告哪些类型的误报?可以报告哪些类型的假阳性内存泄漏?

事实上,GlowCode会提醒您防止误报。根据您运行的扫描类型,可能会出现更多误报。

带着这个问题,我想弄清楚的事情怎么样GlowCode扫描仪比较的WinDbg的!heap -l ...

我会感激任何提示您可以提供!

UPDATE:如果你能给一些C 真正例如++(或您的首选语言),这将有很大的帮助。

回答

1

内存调试器的一般方法是在程序退出时报告所有分配的内存。这个内存可能会被泄漏,但它可能只是为应用程序的整个生命周期分配的内存,并且从未明确释放(本身是一个有问题的编程习惯)。

其他工具(例如静态分析器)尝试匹配分配/释放调用或某些编程模式。例如,MS prefast工具会警告您,如果您分配内存并调用可能会在没有try块的情况下抛出异常的函数。一种情况是这种情况是误报,其中分配的对象在父对象被销毁时会自动删除。

1

有两种内存通过泄漏检测器报告:

  • 存储器,它是没有更多的可到达的(即没有办法让从全局变量指针它们)。如果您玩技巧来隐藏值指针,那么在这里可能会出现误判(从内存实际上仍然可以到达的意义上说)。其中一些是符合的,一些在实践中有效,但不是。他们往往是可疑的性质,但在记忆紧张的情况下工作时可以来得方便。自从我在嵌入式8位系统中工作以来,我一直没有使用它们。这些通常在代码库中很少见。

  • 内存在程序结束时仍然可以访问但尚未释放。这种可以被称为“误报”。这个用法是风格问题;人们可能会质疑在退出程序时不删除对象的做法的可靠性,因为人们可能会质疑做出不可观察的工作的效用,只要运行时被忽略,这种效果是不可观测的。请注意,有时它是故意完成的,以便可以在程序退出时调用的静态析构函数中使用该对象。

+0

寻找内存泄漏的工具在执行期间如何? – 2009-08-20 10:45:01

+0

在执行过程中,报告可访问的内存(除了提供分配统计信息)没有多大意义,因此它们报告无法访问的内存。 – AProgrammer 2009-08-20 11:41:10

+0

当然,我正在谈论_unreachable_内存......这就是你所说的内存泄漏,不是吗? – 2009-08-20 12:26:51

1

假设您已经在地址A和地址B分配了内存并将这些值保存到相应的指针。然后,分别用(A + B)和(A-B)替换A和B的值。

如何在世界中应该检查器猜测内存仍然可以访问?你真的可以恢复原来的指针值,也许你真的在某个地方。但它应该如何猜测?如果你用三角函数或RSA来改变这些值? :)

还有一件事。您听起来像是更多的误报意味着更糟糕的工具。但是,一般来说,当假阳性数量增加时,假阴性数量会减少。这就像是成为一个更可疑的侦探,抓住一个难以捉摸的罪犯,但同时劫持更多无辜的人。

+0

我不想评判任何工具,我只想了解一些应用程序如何设法避免误报,如果你让他们有更多的处理时间这样做。 谢谢你的回答! – 2009-08-21 06:39:40

+0

作为一个简单的例子,一些跳棋可以让你打开和关闭流敏感别名分析。简单看看你的代码告诉我们,在free(x)中,x可能指向a和b内存区域,因为代码如下所示: x = a; ... x = b; ... free(b); free(x); 哇,你的程序_may_可以释放b两次,检查员说,并报告错误。 但是,如果检查人员花更多时间查看代码,他可能会注意到它实际上看起来像这样: x = a;如果(2 * 2 == 5) x = b; ... free(b); free(x); 然后它会报告没有错误。 – 2009-08-22 10:56:46