最近因项目需要,需要对现有程序进行内存检查。找到了valgrind工具
valgrind是gnu提供。在现有环境(cent-os 5.5)的光碟下,已经有了安装包,直接 rpm -i 就可以进行安装
basis options
-h 不用讲了,肯定是帮助吗
还有一些常规命令,不解释...................
--help-debug
--version
-q, --quiet
-v, --verbose
..............................
可以去手冊查看都是干嘛的,下面主要介绍常用的一些参数
valgrind 的检查规则非常严格,一些系统库的函数常常都会被报有问题,所以需要进行过滤(suppression)
valgrind的过滤配置文件类型是*.supp
格式如下:
# Format of this file is:
# {
# name_of_suppression
# tool_name:supp_kind
# (optional extra info for some suppression types)
# caller0 name, or /name/of/so/file.so
# caller1 name, or ditto
# (optionally: caller2 name)
# (optionally: caller3 name)
# }
第一行是名字,可以隨便取一个名字
第二行冒号前面的是工具名称,例如Memcheck,exp-ptrcheck。。。和运行时候参数toolname一致
第二行冒号后面是忽略的种类,Memcheck下常见的忽略有Value1,Valus4.......Addr4.......Cond........Leak
在后面就是过滤的规则了。也是函数的调用顺序
第一行是也是报错时候at的地方,然后依次的调用顺序
example:
{
strlen/decompose_rpath/_dl_map_object
Memcheck:Cond
fun:strlen
fun:decompose_rpath
fun:_dl_map_object
}
名字取的是调用顺序,最后产生错误的函数式strlen,调用顺序strlen <--- decomose_rpath <--- _dl_map_object
在使用中需要主要,最好不要自己去写一个suppression,最好通过valgrind生成的。因为有时候报错时候的函数名称和最后过滤的并不一致(过滤时候看上去像编译出来的符号,c++ standard还没学好,只是猜测)
下面是一例通过valgrind 生成的suppression
{
snprintf-1
Memcheck:Value4
fun:_itoa_word
fun:vfprintf
fun:vsnprintf
fun:snprintf
fun:_ZN6Events12copyEventsMeEP6ResultSt6vectorI14TNsEventSTRUCTSaIS3_EE
fun:_ZN6Events6invokeESs7CommandP7Results
fun:_ZN19NotificationManager6invokeEPN6google8protobuf13RpcControllerEPK13invokeRequestP7ResultsPNS1_7ClosureE
fun:_ZN8IManager10CallMethodEPKN6google8protobuf16MethodDescriptorEPNS1_13RpcControllerEPKNS1_7MessageEPS7_PNS1_7ClosureE
fun:_ZN6casock3rpc8protobuf6server18RPCCallHandlerImpl3runEv
fun:_ZN6casock4util6Thread9runThreadEPv
fun:start_thread
fun:clone
}
系统函数好像都可以直接显示出来,头两个函数为什么能直接写出来暂时还不清楚
生成suppression的命令为
valgrind --tool=memcheck --gen-suppressions=all --log-file=./log (you program)
生成的过滤条件在log文件里
新建一个过滤文件example.supp,将过滤信息copy进去。然后运行
valgrind --tool=memcheck --suppressions=./example.supp --log-file=./log (you program)
想过滤掉的信息就可以过滤掉了