GCC 的调试堆/STL 调试等效项?
Posted
技术标签:
【中文标题】GCC 的调试堆/STL 调试等效项?【英文标题】:Debug heap/STL debugging equivalent for GCC? 【发布时间】:2009-07-24 12:51:37 【问题描述】:我计划更多地使用 GCC(Linux 和 Windows),我想知道是否有类似的 MSVC debug heap 和 STL checks 可用于 GCC CRT 和 STL。
我已经了解 Valgrind 等工具,但我正在寻找库中内置的东西。
【问题讨论】:
【参考方案1】:我对调试堆和 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) 了解更多信息。
【讨论】:
这正是调试堆所做的彼得,谢谢!您是否碰巧知道这些检查是否也针对新/删除进行? 在我的实现中确实如此(至少,操作符 delete 似乎有一个对 free() 的底层调用,因此它捕获了双重释放)。 Electric Fence 肯定会使用 operator new 分配的内存捕获缓冲区溢出。 请注意,glibc 2.10 和 2.11 存在错误:MALLOC_CHECK_ 可能导致多线程程序挂起和崩溃。【参考方案2】:http://sourceforge.net/projects/stlport/ 的标准库的 STLport 版本有一个调试模式,我曾经使用过,并且是 Scott Meyers 在 Effective STL 中推荐的。但是我已经好几年没用了,所以我不能保证目前的状态。
还有一个关于 GCC STL 调试here 的帖子,但我再次无法保证它提供的信息。
【讨论】:
谢谢尼尔。我真的不想替换 STL,因为我使用的是使用“标准”STL 构建的 3rd 方库。 不幸的是,即使您使用的库实现与您的常规库来自同一供应商,您也必须使用一组不同的 STL 容器来获得对调试 STL 的支持。我敢肯定,如果您使用的是调试版本,那么对象不会改变其布局的地方实际上并没有任何“调试 STL”。所以恕我直言,无论如何,您都必须使用相同版本的库和相同的标志重建所有组件。 据我所知,MSVC 默认开启了调试 STL 功能,因此使用 STL 的库的调试版本将使用调试功能(假设他们没有明确关闭它们- 这会使 lib 与默认的 MSVC 项目不兼容)。我可以努力重建,但如果可能的话,我仍然想使用经典的 STL。【参考方案3】:我从未使用过它们,但我知道 glibc 有一些功能可以调试动态分配的内存。这是一个相关的手动条目http://www.gnu.org/s/libc/manual/html_node/Memory-Allocation.html#Memory-Allocation。 “无约束分配”包含一些关于挂钩分配函数的各种方法的信息,“分配调试”包含一些关于 glibc 跟踪分配能力的信息。
就个人而言,我认为 Valgrind 是最简单的方法。
【讨论】:
【参考方案4】:使用 efence/DUMA 可以进行一些堆调试(即使在 MinGW 下)
【讨论】:
【参考方案5】:可以通过在包含任何标准库之前定义 _GLIBCXX_DEBUG
来启用您要查找的内容。如果您不能始终如一地使用它,我不确定这会产生什么影响。我的默认建议是非常小心。另外我听说调试检查可能会对性能造成很大影响。如此之大,始终启用它以进行调试构建可能是不明智的。
【讨论】:
以上是关于GCC 的调试堆/STL 调试等效项?的主要内容,如果未能解决你的问题,请参考以下文章
Codeblocks 调试(debug)如何查看 STL vector等容器的内容
在 Visual Studio 2012 中调试 C++ 代码时跳过 STL 代码?