C++ 调试堆/STL调试等效于GCC?

C++ 调试堆/STL调试等效于GCC?,c++,debugging,gcc,C++,Debugging,Gcc,我计划更多地使用GCC(Linux和Windows),我想知道是否有一种类似于MSVC的软件可以用于GCC CRT和STL 我已经知道Valgrind等工具,但我正在寻找库中内置的工具。的标准库的STLport版本有一个调试模式,我曾经使用过,这是Scott Meyers在有效STL中推荐的。然而,我已经好几年没有使用它了,所以我不能保证目前的状态 还有一个关于GCC STL调试的线程,但我再一次无法保证它提供的信息。我从未使用过它们,但我知道glibc具有一些调试动态分配内存的功能。这是一个相

我计划更多地使用GCC(Linux和Windows),我想知道是否有一种类似于MSVC的软件可以用于GCC CRT和STL


我已经知道Valgrind等工具,但我正在寻找库中内置的工具。

的标准库的STLport版本有一个调试模式,我曾经使用过,这是Scott Meyers在有效STL中推荐的。然而,我已经好几年没有使用它了,所以我不能保证目前的状态


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

我从未使用过它们,但我知道glibc具有一些调试动态分配内存的功能。这是一个相关的手动输入。“无约束分配”包含一些关于钩住分配函数的各种方法的信息,“分配调试”包含一些关于glibc跟踪分配能力的信息


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

我对调试堆和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() 马上。这可能很有用,因为否则崩溃可能会频繁发生 后来,问题的真正原因很难找到


还有一个电子围栏,它可以帮助捕获一旦发生溢出/欠载就中止的缓冲区溢出。有关更多信息,请参阅。

efence/DUMA提供了一些堆调试(即使在MinGW下)

在包含任何标准库之前,可以通过定义
\u GLIBCXX\u DEBUG
来启用您要查找的内容。我不确定如果你不能始终如一地使用它会有什么影响。我默认的建议是非常小心。我还听说调试检查可能会对性能造成很大影响。太大了,总是让它为调试版本启用可能是不明智的。

谢谢Neil。我真的不想替换STL,因为我使用的是用“标准”STL构建的第三方库。不幸的是,即使使用与常规库相同的供应商提供的库实现,您也必须使用一组不同的STL容器来获得对调试STL的支持。我很确定,如果您使用的是调试版本,那么没有任何对象不改变布局的“调试STL”。因此,IMHO您必须使用相同版本的库和相同的标志重新构建所有组件。据我所知,MSVC默认启用了调试STL功能,因此使用STL的库的调试版本将使用调试功能(假设它们没有显式地关闭它们——这将使lib与默认的MSVC项目不兼容)。我可以努力重建,但如果可能的话,我仍然希望使用经典的STL。这正是调试堆所做的,Peter,谢谢!你知道这些检查是否也对new/delete进行了吗?在我的实现中是这样的(至少运算符delete似乎有一个对free()的底层调用),因此它捕获了双重空闲)。Electric Fence肯定会捕获缓冲区溢出,并使用操作员new分配的内存。请注意,glibc 2.10和2.11存在缺陷:MALLOC_CHECK_会导致多线程程序挂起和崩溃。