2009-07-24 69 views

回答

7

我不是太熟悉的调试堆和STL检查,但是当我有记忆问题在GCC在Linux上我使用名为MALLOC_CHECK_(通过malloc(3))环境变量:

最近Linux libc(晚于5.4.23)和GNU libc(2.x)的版本包括一个 malloc实现,它可以通过环境变量进行调整。当 MALLOC_CHECK_被设置时,使用一个特殊的(效率较低的)实现,其被设计为容忍简单错误,例如具有相同参数的free() 的双重调用,或者单个字节的溢出(off-by - 一个错误)。然而,并不是所有的 这样的错误都可以被保护,并且可能导致内存泄漏。如果 MALLOC_CHECK_设置为0,则任何检测到的堆损坏都会被忽略;如果 设置为1,诊断打印在stderr上;如果设置为2,则立即将abort()称为 。这可能很有用,因为否则后面的崩溃可能会发生很多,并且问题的真正原因很难追查到。

还有电篱笆,可以帮助赶上超限/欠载发生缓冲超限中止。有关更多信息,请参见libefence(3)

3

标准库的STLport版本http://sourceforge.net/projects/stlport/有一个调试模式,我曾经使用过,这是Scott Meyers在Effective STL中推荐的。但是现在我已经使用了好几年了,所以我不能保证目前的状态。

还有一个关于GCC STL调试的线程here,但我再次无法保证它给出的信息。

+0

谢谢尼尔。我真的不希望替换STL,因为我使用用“标准”STL构建的第三方库。 – rpg 2009-07-24 13:00:51

+1

不幸的是,你将不得不使用一组不同的STL容器,即使你使用来自同一供应商为你经常库附带一个库实现以获取调试STL的支持。我很肯定,如果你使用的是调试版本,那么对象不会改变它们的布局,那么没有真正的'调试STL'。所以恕我直言,你将不得不去使用相同版本的库和相同的标志重建所有组件。 – 2009-07-24 13:08:02

+0

据我所知,默认情况下,MSVC具有调试STL功能,因此使用STL的库的调试版本将使用调试功能(假设它们没有明确关闭它们 - 这会使库不兼容与默认的MSVC项目)。 我可以做出努力并重建,但如果可能的话,我仍然希望使用经典的STL。 – rpg 2009-07-24 13:25:40

2

我从来没有使用过它们,但我知道glibc具有一些用于动态分配内存调试的功能。这里有一个相关的手册条目http://www.gnu.org/s/libc/manual/html_node/Memory-Allocation.html#Memory-Allocation。 “Unconstrained Allocation”有一些关于分配函数挂钩的方法,“Allocation Debugging”包含一些关于glibc跟踪分配的能力的信息。

就我个人而言,我认为Valgrind是最简单的方法。

3

一些堆调试提供与您要查找的内容可以包括任何标准库之前定义_GLIBCXX_DEBUG启用用efence /杜马(议会下连MinGW的)

2

。如果不能一致使用,我不确定会对此产生什么影响。我的默认建议是要非常小心。另外我听说调试检查可能是一个很大的性能问题。这么大以至于总是让它启用调试版本可能是不明智的。