常用的内存泄漏检查工具

Posted 搞IT的锋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用的内存泄漏检查工具相关的知识,希望对你有一定的参考价值。

以下是一些常用的内存泄漏检查工具:

1. Valgrind:Valgrind是一种开源的内存调试和性能分析工具,可以检测内存泄漏、使用未初始化的内存、使用已释放的内存等问题。

2. AddressSanitizer(ASan):ASan是一种内存错误检测工具,可以检测内存泄漏、缓冲区溢出、使用未初始化的内存等问题。

3. LeakSanitizer(LSan):LSan是一种内存泄漏检测工具,可以检测动态分配的内存是否被释放。

4. Electric Fence:Electric Fence是一种内存调试工具,可以检测内存越界、使用已释放的内存等问题。

5. Purify:Purify是一种商业化的内存泄漏检测工具,可以检测内存泄漏、使用未初始化的内存等问题。

6. Insure++:Insure++是一种商业化的内存泄漏检测工具,可以检测内存泄漏、使用未初始化的内存等问题。

这些工具都有各自的优缺点,您可以根据自己的需求选择适合自己的工具。


Valgrind怎么使用

要使用Valgrind检测内存泄漏,可以按照以下步骤操作:

1. 安装Valgrind

在终端中输入以下命令:

sudo apt-get install valgrind

2. 编译程序

在终端中进入程序所在的目录,并使用编译器编译程序。例如,如果您要编译一个名为“myprogram”的C程序,可以使用以下命令:

gcc -o myprogram myprogram.c

3. 运行Valgrind

在终端中输入以下命令:

valgrind --leak-check=full ./myprogram

Valgrind将运行您的程序,并检测内存泄漏。如果发现内存泄漏,Valgrind将输出相关信息,例如泄漏的内存地址、泄漏的大小等。

注意:Valgrind会降低程序的运行速度,因此在生产环境中不应该使用Valgrind。

除了检测内存泄漏,Valgrind还可以检测其他内存错误,例如使用未初始化的内存、使用已释放的内存等。您可以使用不同的选项来启用这些检测。例如,要检测使用未初始化的内存,可以使用以下命令:

valgrind --track-origins=yes ./myprogram

这将启用“--track-origins”选项,使Valgrind能够跟踪未初始化的内存。


AddressSanitizer怎么使用

要使用AddressSanitizer(ASan)检测内存泄漏,可以按照以下步骤操作:

1. 编译程序

在终端中进入程序所在的目录,并使用编译器编译程序。例如,如果您要编译一个名为“myprogram”的C程序,可以使用以下命令:

gcc -fsanitize=address -o myprogram myprogram.c

这将使用ASan编译程序,并生成一个名为“myprogram”的可执行文件。

2. 运行程序

在终端中输入以下命令:

./myprogram

ASan将运行您的程序,并检测内存泄漏。如果发现内存泄漏,ASan将输出相关信息,例如泄漏的内存地址、泄漏的大小等。

注意:ASan会降低程序的运行速度,因此在生产环境中不应该使用ASan。

除了检测内存泄漏,ASan还可以检测其他内存错误,例如缓冲区溢出、使用未初始化的内存等。您可以使用不同的选项来启用这些检测。例如,要检测缓冲区溢出,可以使用以下命令:

gcc -fsanitize=address -fsanitize=undefined -o myprogram myprogram.c

这将启用ASan的缓冲区溢出检测和未定义行为检测。

Linux中内存泄漏检查工具的问题[关闭]

【中文标题】Linux中内存泄漏检查工具的问题[关闭]【英文标题】:Problem with memory leak check tools in Linux [closed] 【发布时间】:2011-08-29 10:47:35 【问题描述】:

1) 还有没有内存泄露工具叫Boehmgc?该工具与其他工具相比如何?

2) 我使用过LeakTracermudflapValgrind。但遗憾的是 LeakTracer 有内存占用的缺点(一开始就池化大量内存,然后分配),那么有什么替代方案呢?

【问题讨论】:

“所有 X 的列表”不是一个好问题。 @awoodland:可能对开发人员很有帮助,因为我们知道 LeakTracer 在开始时会占用大量内存,因此有助于选择合适的工具。 meta.stackexchange.com/questions/57226/… 和类似的讨论是我关心的 你可以很容易地问“如何实现内存泄漏检测器”或“为什么这个泄漏检测器说我有泄漏?”用那个标签。 我认为您提出的问题超出了“X 列表”的范围,特别是如果您将其改写为“垃圾收集和泄漏检测之间有什么区别”。这是“你能说出所有泄漏检查工具的名字吗”不太适合恕我直言。 【参考方案1】:

Boehm GC是一个垃圾收集器,类似于Java中的垃圾收集器。您提到的其他工具旨在警告您有关泄漏,以便您可以采取纠正措施。垃圾收集旨在在程序运行时查找和恢复不再使用的分配。示例(来自***页面):

#include <assert.h>
#include <stdio.h>
#include <gc.h>

int main(void)

    int i;

    GC_INIT();
    for (i = 0; i < 10000000; ++i)
    
        // GC_MALLOC instead of malloc
        int **p = GC_MALLOC(sizeof(int *));
        int *q = GC_MALLOC_ATOMIC(sizeof(int));

        assert(*p == 0);
        // GC_REALLOC instead of realloc
        *p = GC_REALLOC(q, 2 * sizeof(int));
        if (i % 100000 == 0)
            printf("Heap size = %zu\n", GC_get_heap_size());
    

    // No free()

    return 0;

就我个人而言,在 C 或 C++ 中使用垃圾收集让我感到非常不安。对于 C++,“Smart pointers”是我认为在所有权不明确的情况下要走的路(尽管您可能想要了解为什么在您的设计中不清楚)并寻求帮助安全性(例如,现在已弃用的 std::auto_ptr 的设计目的)

至于检漏仪,您可以添加:

ccmalloc dmalloc NJAMD (Not just another memory debugger) mpatrol YAMD (yet another malloc debugger)

到你的 Linux 列表。

相关的内存检查工具,但不是泄漏:

Electric fence

【讨论】:

Efectric Fence 是内存溢出检测工具而不是内存泄漏。 @king - 我认为它也有泄漏跟踪功能? 不,它没有。它只有内存溢出检测,也有欠载EF_PROTECT_BELOW @awoodland:谢谢,太好了!!在我接受你的回答之前,让我等待更多的回复。 我已接受您的回答,谢谢。虽然它已关闭,但我的需求得到了满足:)

以上是关于常用的内存泄漏检查工具的主要内容,如果未能解决你的问题,请参考以下文章

Linux 下几款程序内存泄漏检查工具

Linux 下几款程序内存泄漏检查工具

valgrind - 检查程序中的内存泄漏问题

delphi 检测内存泄露 工具都有哪些

如何检查 C++ 代码中的内存泄漏。有没有检查内存泄漏的免费工具[重复]

如何用VS工具检测内存泄露