Valgrind 在不终止程序的情况下检测内存泄漏

lin*_*ize 5 c c++ linux valgrind memory-leaks

Valgrind 是否可以在不终止程序的情况下检测可达/内存泄漏?

即退出程序前如何知道结果?

Jon*_*ler 1

如果您在 GDB 下运行程序,那么文档中描述了一些选项,特别是MemCheck Monitor Commands部分,具体来说,提到的命令之一是leak_check

  • leak_check [full*|summary] [kinds <set>|reachable|possibleleak*|definiteleak] [heuristics heur1,heur2,...] [increased*|changed|any] [unlimited*|limited <max_loss_records_output>]执行泄漏检查。参数中的 * 表示默认值。

如果[full*|summary]参数是摘要,则仅给出泄漏搜索的摘要;否则会生成完整的泄漏报告。完整的泄漏报告提供了每次泄漏的详细信息:分配泄漏块的堆栈跟踪、泄漏块的数量及其总大小。当请求完整报告时,接下来的两个参数进一步指定要报告的泄漏类型。如果泄漏的详细信息与第二个和第三个参数都匹配,则会显示泄漏的详细信息。完整的泄漏报告可能会输出许多泄漏的详细信息。可以使用有限参数后跟要输出的最大泄漏记录数来控制输出信息的泄漏数。如果达到此最大值,泄漏搜索将输出具有最大字节数的记录。

types 参数控制为完整泄漏搜索显示哪种类型的块。<set>可以使用类似于命令行选项的方式指定要显示的泄漏类型集--show-leak-kinds。或者,该值definiteleak相当于kinds definite,该值possibleleak相当于kinds definite,possible:它还将显示可能泄漏的块,即仅找到内部指针的块。值reachable将显示所有块类别(即相当于kinds all)。

启发式参数控制泄漏搜索期间使用的启发式。可以使用<set>类似于命令行选项的方式指定要使用的启发式集--leak-check-heuristics。heuristics 参数的默认值为 heuristics none。

[increased*|changed|any]参数控制为完整泄漏搜索显示哪些类型的更改。增加的值指定仅应显示自上次泄漏检查以来泄漏字节或块数量增加的块分配堆栈。更改的值指定应显示自上次泄漏检查以来发生任何更改的分配堆栈。值any 指定应显示所有泄漏条目,无论增加还是减少。当指定“如果增加”或“更改”时,泄漏报告条目将显示相对于先前泄漏报告的增量。

ETC。

如果您想在程序控制下执行此操作,则下一节“客户端请求”将描述 C 程序可以进行的 API 调用。这些包括:

  • --leak-check=fullVALGRIND_DO_LEAK_CHECK:立即执行完整的内存泄漏检查(如)。这对于逐步检查程序执行中任意位置之间的泄漏非常有用。它没有返回值。