用实际用例讲解valgrind的用法

今天新的功能测试完成后,担心有内存泄漏问题,所以用valgrind进行下检测。通过valgrind检测还真的发现了一处内存泄漏的问题。

下面详细介绍下我是如何使用的。

1:安装valgrind

先执行下valgrind命令,如果没有valgrind命令,需要安装下。我是用yum install valgrind。

2:使用内存工具

valgrind --tool=memcheck --leak-check=full dns test 1

其中valgrind是命令,--tool=memcheck是使用内存检测工具。 --leak-check=full 对内存完整使用检查。dns是等待检测的可执行程序。dns需要是debug方式编译。test是dns的参数,1也是dns的参数。

3:运行后,跑一下实际用例

查找definitely的关键字样。如果有definitely,那么程序很有可能有内存泄漏。

比如检测我的程序,结果文字如下:

==7590== 54,096 (2,352 direct, 51,744 indirect) bytes in 6 blocks are definitely lost in loss record 148 of 166
==7590==    at 0x4C2A593: operator new(unsigned long) (vg_replace_malloc.c:344)
==7590==    by 0x72AC2C: TDnsMsgImpl::parse(char**) (dnsmsg.C:111)
==7590==    by 0x72D322: TDnsTransaction::recvmsg(TCode) (dnstransaction.C:46)
==7590==    by 0x5213C6: processDNSMessage(TCode, int) (feam.C:1808)
==7590==    by 0x5313B4: TUDPPort::checkFDSet(fd_set*) (udpport.C:368)
==7590==    by 0x531F56: TUDPPortTable::checkFDSet(fd_set*) (udpport.C:605)
==7590==    by 0x5291B7: TFEAM::active(int) (feam.C:3845)
==7590==    by 0x55CF61: mainLoop() (scmectrl.C:420)
==7590==    by 0x56AA61: inRun() (inmain.C:312)
==7590==    by 0x56B76F: main (inmain.C:788)
==7590== 
==7590== 54,096 (2,352 direct, 51,744 indirect) bytes in 6 blocks are definitely lost in loss record 149 of 166
==7590==    at 0x4C2A593: operator new(unsigned long) (vg_replace_malloc.c:344)
==7590==    by 0x72AC2C: TDnsMsgImpl::parse(char**) (dnsmsg.C:111)
==7590==    by 0x72D544: TDnsTransaction::recvmsg(TCode) (dnstransaction.C:78)
==7590==    by 0x5213C6: processDNSMessage(TCode, int) (feam.C:1808)
==7590==    by 0x5313B4: TUDPPort::checkFDSet(fd_set*) (udpport.C:368)
==7590==    by 0x531F56: TUDPPortTable::checkFDSet(fd_set*) (udpport.C:605)
==7590==    by 0x5291B7: TFEAM::active(int) (feam.C:3845)
==7590==    by 0x55CF61: mainLoop() (scmectrl.C:420)
==7590==    by 0x56AA61: inRun() (inmain.C:312)
==7590==    by 0x56B76F: main (inmain.C:788)
==7590== 
==7590== 63,112 (2,744 direct, 60,368 indirect) bytes in 7 blocks are definitely lost in loss record 153 of 166
==7590==    at 0x4C2A593: operator new(unsigned long) (vg_replace_malloc.c:344)
==7590==    by 0x72C495: dnsGetXMLElem(char const*, char const*) (dnsmsg.C:453)
==7590==    by 0x72AC8B: TDnsMsgImpl::parse(char**) (dnsmsg.C:116)
==7590==    by 0x72D322: TDnsTransaction::recvmsg(TCode) (dnstransaction.C:46)
==7590==    by 0x5213C6: processDNSMessage(TCode, int) (feam.C:1808)
==7590==    by 0x5313B4: TUDPPort::checkFDSet(fd_set*) (udpport.C:368)
==7590==    by 0x531F56: TUDPPortTable::checkFDSet(fd_set*) (udpport.C:605)
==7590==    by 0x5291B7: TFEAM::active(int) (feam.C:3845)
==7590==    by 0x55CF61: mainLoop() (scmectrl.C:420)
==7590==    by 0x56AA61: inRun() (inmain.C:312)
==7590==    by 0x56B76F: main (inmain.C:788)
==7590== 
==7590== 63,112 (2,744 direct, 60,368 indirect) bytes in 7 blocks are definitely lost in loss record 154 of 166
==7590==    at 0x4C2A593: operator new(unsigned long) (vg_replace_malloc.c:344)
==7590==    by 0x72C495: dnsGetXMLElem(char const*, char const*) (dnsmsg.C:453)
==7590==    by 0x72AC8B: TDnsMsgImpl::parse(char**) (dnsmsg.C:116)
==7590==    by 0x72D544: TDnsTransaction::recvmsg(TCode) (dnstransaction.C:78)
==7590==    by 0x5213C6: processDNSMessage(TCode, int) (feam.C:1808)
==7590==    by 0x5313B4: TUDPPort::checkFDSet(fd_set*) (udpport.C:368)
==7590==    by 0x531F56: TUDPPortTable::checkFDSet(fd_set*) (udpport.C:605)
==7590==    by 0x5291B7: TFEAM::active(int) (feam.C:3845)
==7590==    by 0x55CF61: mainLoop() (scmectrl.C:420)
==7590==    by 0x56AA61: inRun() (inmain.C:312)
==7590==    by 0x56B76F: main (inmain.C:788)
==7590== 
==7590== LEAK SUMMARY:
==7590==    definitely lost: 10,192 bytes in 26 blocks
==7590==    indirectly lost: 224,224 bytes in 572 blocks
==7590==      possibly lost: 6,512 bytes in 11 blocks
==7590==    still reachable: 127,271,869 bytes in 13,183 blocks
==7590==                       of which reachable via heuristic:
==7590==                         stdstring          : 89 bytes in 3 blocks
==7590==                         newarray           : 9,993,560 bytes in 3 blocks
==7590==         suppressed: 0 bytes in 0 blocks

通过分析代码,发现确实有内存泄漏,new的对象没有在析构时删除。

经过修改后,再次测试。直到 definitely lost: 0 bytes in 0 blocks为止。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉心编码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值