【发布时间】:2009-07-24 12:51:37
【问题描述】:
我计划更多地使用 GCC(Linux 和 Windows),我想知道是否有类似的 MSVC debug heap 和 STL checks 可用于 GCC CRT 和 STL。
我已经了解 Valgrind 等工具,但我正在寻找库中内置的东西。
【问题讨论】:
我计划更多地使用 GCC(Linux 和 Windows),我想知道是否有类似的 MSVC debug heap 和 STL checks 可用于 GCC CRT 和 STL。
我已经了解 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() 立即地。这可能很有用,因为否则可能会发生很多崩溃 之后,问题的真正原因就很难找到了。
还有 Electric Fence 可以帮助捕获缓冲区溢出,一旦溢出/欠载发生就中止。请参阅libefence(3) 了解更多信息。
【讨论】:
http://sourceforge.net/projects/stlport/ 的标准库的 STLport 版本有一个调试模式,我曾经使用过,并且是 Scott Meyers 在 Effective STL 中推荐的。但是我已经好几年没用了,所以我不能保证目前的状态。
还有一个关于 GCC STL 调试here 的帖子,但我再次无法保证它提供的信息。
【讨论】:
我从未使用过它们,但我知道 glibc 有一些功能可以调试动态分配的内存。这是一个相关的手动条目http://www.gnu.org/s/libc/manual/html_node/Memory-Allocation.html#Memory-Allocation。 “无约束分配”包含一些关于挂钩分配函数的各种方法的信息,“分配调试”包含一些关于 glibc 跟踪分配能力的信息。
就个人而言,我认为 Valgrind 是最简单的方法。
【讨论】:
使用 efence/DUMA 可以进行一些堆调试(即使在 MinGW 下)
【讨论】:
可以通过在包含任何标准库之前定义 _GLIBCXX_DEBUG 来启用您要查找的内容。如果您不能始终如一地使用它,我不确定这会产生什么影响。我的默认建议是非常小心。另外我听说调试检查可能会对性能造成很大影响。如此之大,始终启用它以进行调试构建可能是不明智的。
【讨论】: