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

时间:2013-12-31 01:56:36

标签: c++ c linux memory-leaks valgrind

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

那就是如何在退出程序之前知道结果?

1 个答案:

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

     

types参数控制为完整泄漏搜索显示哪种块。可以使用<set>指定要显示的泄漏类型集,类似于命令行选项--show-leak-kinds。或者,值definiteleak相当于kinds definite,值possibleleak相当于kinds definite,possible:它还会显示可能泄漏的块,.ie那些只有内部的块指针被发现了。值可达将显示所有块类别(即等同于所有类别)。

     

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

     

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

如果你想在程序控制下进行,那么下一节Client Requests描述了C程序可以进行的API调用。其中包括:

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