我计划更多地使用GCC(Linux和Windows),我想知道是否有相当于GCC CRT和STL的MSVC debug heap 和STL checks。
我已经了解Valgrind等工具,但我正在寻找库中的内容。
答案 0 :(得分:7)
我对调试堆和STL检查不太熟悉,但是当我在Linux上的GCC中遇到内存问题时,我使用了一个名为MALLOC_CHECK_的环境变量(来自malloc(3)):
最新版本的Linux libc(晚于5.4.23)和GNU libc(2.x)包含一个 malloc实现,可通过环境变量进行调整。什么时候 设置MALLOC_CHECK_,使用特殊(效率较低)的实现 旨在容忍简单的错误,例如free()的双重调用 使用相同的参数,或超出单个字节(逐个错误)。不是全部 但是,可以防止此类错误,并且可能导致内存泄漏。如果 MALLOC_CHECK_设置为0,任何检测到的堆损坏都会被静默忽略;如果 设置为1,在stderr上打印诊断;如果设置为2,则调用abort() 立即。这可能很有用,因为否则可能会发生崩溃 之后,问题的真正原因很难追查。
还有电围栏,一旦发生超限/欠载,就可以帮助捕捉缓冲区溢出中止。有关详细信息,请参阅libefence(3)。
答案 1 :(得分:3)
http://sourceforge.net/projects/stlport/标准库的STLport版本有一个调试模式,我曾经使用过,这是Scott Meyers在Effective STL中推荐的。我现在已经好几年没用过了,所以我不能保证目前的状态。
还有一个关于GCC STL调试的帖子here,但我再一次无法保证它提供的信息。
答案 2 :(得分:3)
使用efence / DUMA进行一些堆调试(即使在MinGW下)
答案 3 :(得分:2)
我从来没有使用过它们,但我知道glibc有一些调试动态分配内存的功能。这是相关的手册条目http://www.gnu.org/s/libc/manual/html_node/Memory-Allocation.html#Memory-Allocation。 “无约束分配”有关于挂钩分配函数的各种方法的一些信息,“分配调试”包含有关glibc无法跟踪分配的一些信息。
就个人而言,我认为Valgrind是最简单的方法。
答案 4 :(得分:2)
在包含任何标准库之前,可以通过定义_GLIBCXX_DEBUG
来启用您要查找的内容。如果你不能持续使用它,我不确定会有什么影响。我的默认建议是要非常小心。此外,我听说调试检查可能是一个很大的性能影响。如此之大以至于始终为调试版本启用它可能是不明智的。