﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-I smell magic in the air-随笔分类-调试</title><link>http://www.cppblog.com/izualzhy/category/19699.html</link><description>坚持 相信自己</description><language>zh-cn</language><lastBuildDate>Tue, 17 Jul 2012 11:37:10 GMT</lastBuildDate><pubDate>Tue, 17 Jul 2012 11:37:10 GMT</pubDate><ttl>60</ttl><item><title>valgrind的使用方法以及日志分析</title><link>http://www.cppblog.com/izualzhy/archive/2012/07/17/183927.html</link><dc:creator>izualzhy</dc:creator><author>izualzhy</author><pubDate>Tue, 17 Jul 2012 11:36:00 GMT</pubDate><guid>http://www.cppblog.com/izualzhy/archive/2012/07/17/183927.html</guid><wfw:comment>http://www.cppblog.com/izualzhy/comments/183927.html</wfw:comment><comments>http://www.cppblog.com/izualzhy/archive/2012/07/17/183927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/izualzhy/comments/commentRss/183927.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/izualzhy/services/trackbacks/183927.html</trackback:ping><description><![CDATA[<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2a69953b-5a28-42e8-84d9-d8a5ca13db8a" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/vargrind" rel="tag">vargrind</a></div> <p><strong>简介：</strong></p> <p><b>Valgrind</b>是一款用于内存调试、<a href="http://zh.wikipedia.org/wiki/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F">内存泄漏</a>检测以及<a href="http://zh.wikipedia.org/wiki/%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90">性能分析</a>的<a href="http://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7">软件开发工具</a>。</p> <p><strong>使用方法：</strong></p> <p>vargrind&nbsp; --tool=memcheck ./a.out</p> <p>如果需要日志，则添加</p> <p>vargrind –log-file=var.log –tool=memcheck ./a.out</p> <p>常用的options： –track-origins=yes –leak-check=full –num-callers=*</p> <p>1.内存泄露：</p><pre class="code"><span style="color: #400080">#include </span><span style="color: #259241">&lt;stdio.h&gt;

</span><span style="color: #400080">void </span>function<span style="color: #2e53d1">()
{
    </span><span style="color: #400080">int </span><span style="color: #2e53d1">*</span>p <span style="color: #2e53d1">= (</span><span style="color: #400080">int</span><span style="color: #2e53d1">*)</span>malloc<span style="color: #2e53d1">(</span><span style="color: #259241">10</span><span style="color: #2e53d1">*</span><span style="color: #400080">sizeof</span><span style="color: #2e53d1">(</span><span style="color: #400080">int</span><span style="color: #2e53d1">));
    </span>p<span style="color: #2e53d1">[</span><span style="color: #259241">10</span><span style="color: #2e53d1">] = </span><span style="color: #259241">0</span><span style="color: #2e53d1">;
}

</span><span style="color: #400080">int </span>main<span style="color: #2e53d1">()
{
    </span>function<span style="color: #2e53d1">();

    </span><span style="color: #400080">return </span><span style="color: #259241">0</span><span style="color: #2e53d1">;
}

</span></pre>
<p>相关日志：</p>
<p>==20220== Memcheck, a memory error detector<br>==20220== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.<br>==20220== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info<br>==20220== Command: ./test<br>==20220== Parent PID: 20160<br>==20220== <br>==20220== Invalid write of size 4<br>==20220==&nbsp;&nbsp;&nbsp; at 0x80483FF: function (in /mnt/Documents/Training/valgrind/test)<br>==20220==&nbsp;&nbsp;&nbsp; by 0x8048411: main (in /mnt/Documents/Training/valgrind/test)<br>==20220==&nbsp; Address 0x41be050 is 0 bytes after a block of size 40 alloc'd<br>==20220==&nbsp;&nbsp;&nbsp; at 0x4028876: malloc (vg_replace_malloc.c:236)<br>==20220==&nbsp;&nbsp;&nbsp; by 0x80483F5: function (in /mnt/Documents/Training/valgrind/test)<br>==20220==&nbsp;&nbsp;&nbsp; by 0x8048411: main (in /mnt/Documents/Training/valgrind/test)<br>==20220== <br>==20220== <br>==20220== HEAP SUMMARY:<br>==20220==&nbsp;&nbsp;&nbsp;&nbsp; in use at exit: 40 bytes in 1 blocks<br>==20220==&nbsp;&nbsp; total heap usage: 1 allocs, 0 frees, 40 bytes allocated<br>==20220== <br><font color="#ff0000">==20220== LEAK SUMMARY:<br>==20220==&nbsp;&nbsp;&nbsp; definitely lost: 40 bytes in 1 blocks<br></font>==20220==&nbsp;&nbsp;&nbsp; indirectly lost: 0 bytes in 0 blocks<br>==20220==&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; possibly lost: 0 bytes in 0 blocks<br>==20220==&nbsp;&nbsp;&nbsp; still reachable: 0 bytes in 0 blocks<br>==20220==&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; suppressed: 0 bytes in 0 blocks<br>==20220== Rerun with --leak-check=full to see details of leaked memory<br>==20220== <br>==20220== For counts of detected and suppressed errors, rerun with: -v<br>==20220== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 6)<br></p>
<p>2.使用未初始化的内存</p><pre class="code"><span style="color: #400080">#include </span><span style="color: #259241">&lt;stdio.h&gt;

</span><span style="color: #400080">int </span>main<span style="color: #2e53d1">()
{
    </span><span style="color: #400080">int </span>a<span style="color: #2e53d1">;
    </span><span style="color: #400080">if </span><span style="color: #2e53d1">(</span>a<span style="color: #2e53d1">==</span><span style="color: #259241">1</span><span style="color: #2e53d1">)
    {
        </span>printf<span style="color: #2e53d1">(</span><span style="color: #259241">"a==%d\n"</span><span style="color: #2e53d1">,</span>a<span style="color: #2e53d1">);
    }

    </span><span style="color: #400080">return </span><span style="color: #259241">0</span><span style="color: #2e53d1">;
}

</span></pre>
<p>日志分析：</p>
<p>==20345== Memcheck, a memory error detector<br>==20345== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.<br>==20345== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info<br>==20345== Command: ./test<br>==20345== <br><font color="#ff0000">==20345== Conditional jump or move depends on uninitialised value(s)<br>==20345==&nbsp;&nbsp;&nbsp; at 0x80483F2: main (in /mnt/Documents/Training/valgrind/test)</font><br>==20345== <br>==20345== <br>==20345== HEAP SUMMARY:<br>==20345==&nbsp;&nbsp;&nbsp;&nbsp; in use at exit: 0 bytes in 0 blocks<br>==20345==&nbsp;&nbsp; total heap usage: 0 allocs, 0 frees, 0 bytes allocated<br>==20345== <br>==20345== All heap blocks were freed -- no leaks are possible<br>==20345== <br>==20345== For counts of detected and suppressed errors, rerun with: -v<br><font color="#ff0000">==20345== Use --track-origins=yes to see where uninitialised values come from</font><br>==20345== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 6)<br></p>
<p>可以使用--track-origins=yes 得到更多的信息</p>
<p>3.内存读写越界</p><pre class="code"><span style="color: #400080">#include </span><span style="color: #259241">&lt;stdio.h&gt;

</span><span style="color: #400080">int </span>main<span style="color: #2e53d1">()
{
    </span><span style="color: #400080">int </span><span style="color: #2e53d1">*</span>a <span style="color: #2e53d1">= (</span><span style="color: #400080">int</span><span style="color: #2e53d1">*)</span>malloc<span style="color: #2e53d1">(</span><span style="color: #259241">5</span><span style="color: #2e53d1">*</span><span style="color: #400080">sizeof</span><span style="color: #2e53d1">(</span><span style="color: #400080">int</span><span style="color: #2e53d1">));
    </span>a<span style="color: #2e53d1">[</span><span style="color: #259241">5</span><span style="color: #2e53d1">] = </span><span style="color: #259241">1</span><span style="color: #2e53d1">;

    </span><span style="color: #400080">return </span><span style="color: #259241">0</span><span style="color: #2e53d1">;
}

</span></pre>
<p>==20368== Memcheck, a memory error detector<br>==20368== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.<br>==20368== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info<br>==20368== Command: ./test<br>==20368== <br><font color="#ff0000">==20368== Invalid write of size 4<br>==20368==&nbsp;&nbsp;&nbsp; at 0x8048404: main (in /mnt/Documents/Training/valgrind/test)<br>==20368==&nbsp; Address 0x41be03c is 0 bytes after a block of size 20 alloc'd<br>==20368==&nbsp;&nbsp;&nbsp; at 0x4028876: malloc (vg_replace_malloc.c:236)<br>==20368==&nbsp;&nbsp;&nbsp; by 0x80483F8: main (in /mnt/Documents/Training/valgrind/test)</font><br>==20368== <br>==20368== <br>==20368== HEAP SUMMARY:<br>==20368==&nbsp;&nbsp;&nbsp;&nbsp; in use at exit: 20 bytes in 1 blocks<br>==20368==&nbsp;&nbsp; total heap usage: 1 allocs, 0 frees, 20 bytes allocated<br>==20368== <br>==20368== LEAK SUMMARY:<br>==20368==&nbsp;&nbsp;&nbsp; definitely lost: 20 bytes in 1 blocks<br>==20368==&nbsp;&nbsp;&nbsp; indirectly lost: 0 bytes in 0 blocks<br>==20368==&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; possibly lost: 0 bytes in 0 blocks<br>==20368==&nbsp;&nbsp;&nbsp; still reachable: 0 bytes in 0 blocks<br>==20368==&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; suppressed: 0 bytes in 0 blocks<br><font color="#ff0000">==20368== Rerun with --leak-check=full to see details of leaked memory</font><br>==20368== <br>==20368== For counts of detected and suppressed errors, rerun with: -v<br>==20368== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 6)<br></p>
<p>4.内存申请释放管理错误</p><pre class="code"><span style="color: #400080">#include </span><span style="color: #259241">&lt;stdio.h&gt;

</span><span style="color: #400080">int </span>main<span style="color: #2e53d1">()
{
    </span><span style="color: #400080">int </span><span style="color: #2e53d1">*</span>a <span style="color: #2e53d1">= </span><span style="color: #400080">new int</span><span style="color: #2e53d1">[</span><span style="color: #259241">5</span><span style="color: #2e53d1">];

    </span><span style="color: #937a42">/*free(a);*/
    </span><span style="color: #400080">delete </span>a<span style="color: #2e53d1">;

    </span><span style="color: #400080">return </span><span style="color: #259241">0</span><span style="color: #2e53d1">;
}

</span></pre>
<p>==20387== Memcheck, a memory error detector<br>==20387== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.<br>==20387== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info<br>==20387== Command: ./test<br>==20387== <br><font color="#ff0000">==20387== Mismatched free() / delete / delete []<br>==20387==&nbsp;&nbsp;&nbsp; at 0x4027919: operator delete(void*) (vg_replace_malloc.c:387)<br>==20387==&nbsp;&nbsp;&nbsp; by 0x8048498: main (in /mnt/Documents/Training/valgrind/test)<br>==20387==&nbsp; Address 0x42f2028 is 0 bytes inside a block of size 20 alloc'd<br>==20387==&nbsp;&nbsp;&nbsp; at 0x4027F65: operator new[](unsigned int) (vg_replace_malloc.c:299)<br>==20387==&nbsp;&nbsp;&nbsp; by 0x8048488: main (in /mnt/Documents/Training/valgrind/test)</font><br>==20387== <br>==20387== <br>==20387== HEAP SUMMARY:<br>==20387==&nbsp;&nbsp;&nbsp;&nbsp; in use at exit: 0 bytes in 0 blocks<br>==20387==&nbsp;&nbsp; total heap usage: 1 allocs, 1 frees, 20 bytes allocated<br>==20387== <br>==20387== All heap blocks were freed -- no leaks are possible<br>==20387== <br>==20387== For counts of detected and suppressed errors, rerun with: -v<br>==20387== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 6)</p>
<p>&nbsp;</p>
<p>这里只是简单的测试了几个例子，有兴趣的读者可以参考下面的url。</p>
<p>参考：</p>
<p><a href="http://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/">http://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/</a></p><img src ="http://www.cppblog.com/izualzhy/aggbug/183927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/izualzhy/" target="_blank">izualzhy</a> 2012-07-17 19:36 <a href="http://www.cppblog.com/izualzhy/archive/2012/07/17/183927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>