前言
valgrind 是检查内存泄漏的工具。如果我们的程序集成了第三方模块,但又不希望检查他们的内存泄漏问题,可以通过参数指定valgrind忽略他们。
suppressions 参数
suppressions 参数告诉valgrind忽略指定的错误,用法如下
valgrind --leak-check=full --error-exitcode=1 --suppressions=../test/valgrd_ignore.txt myapp appargs
suppressions 文件内容
suppressions 文件由若干个"{}"段组成,每个段包含3部分内容:
- 第一行为过滤描述,随便写
- 第二行为忽略的类型,Memcheck有7中类型,分别为Cond,Jump, Param, Free, Overlap, Leak, Value1~16, Addr1~16。
- 最后一部分为忽略条件。
{ ignore_cond_libs Memcheck:Cond ... fun:nginx_main ... } { ignore_leak_libs Memcheck:Leak ... fun:nginx_main ... }
suppressions 的说明参见:http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress
忽略条件
忽略条件可以指定为模块名或者函数名。
... fun:nginx_main ...
这个条件的意思是指内存泄漏的调用栈中(前面任意个函数,后面任意个函数)包括函数nginx_main
gen-suppressions
如果不太确认如何判断内存泄漏类型和条件,可以通过参数--gen-suppressions 来获取到这些信息。
Memcheck:Leak match-leak-kinds: possible fun:_Znam fun:_ZN15ACE_SSL_Context16ssl_library_initEv fun:_ZN15ACE_SSL_ContextC1Ev fun:_ZN15ACE_SSL_Context8instanceEv fun:_ZN7dbscale7SSLTool8ssl_initEv fun:_ZN7dbscale7Backend10initializeEv fun:main