valgrind过滤不需要的信息

本文介绍了如何利用valgrind工具进行内存检查,特别是在CentOS 5.5环境下进行安装和基础选项的使用。重点讲解了valgrind的过滤机制,包括创建和使用过滤配置文件(supp)来过滤掉不重要的系统库报错。同时,文章提到了通过valgrind生成过滤规则,并给出了一段示例过滤规则及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近因项目需要,需要对现有程序进行内存检查。找到了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)

想过滤掉的信息就可以过滤掉了

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值