﻿<?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++博客-michael-随笔分类-embedded linux</title><link>http://www.cppblog.com/michaelgao/category/7306.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 03 Feb 2009 00:31:30 GMT</lastBuildDate><pubDate>Tue, 03 Feb 2009 00:31:30 GMT</pubDate><ttl>60</ttl><item><title>valgrind，好东西，一般人我不告诉他~~</title><link>http://www.cppblog.com/michaelgao/archive/2009/02/02/72812.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Mon, 02 Feb 2009 08:50:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2009/02/02/72812.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/72812.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2009/02/02/72812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/72812.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/72812.html</trackback:ping><description><![CDATA[<div class="postTitle"><a href="http://blog.donews.com/idlecat511/archive/2006/02/21/736877.aspx">valgrind，好东西，一般人我不告诉他~~</a></div>
&nbsp;&nbsp;&nbsp; 今天dot.kde登了一篇对valgrind的作者<strong> <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#34;&#62;&#74;&#111;&#110;&#97;&#116;&#104;&#97;&#110;&#32;&#82;&#105;&#100;&#100;&#101;&#108;&#108;&#60;&#47;&#97;&#62;&#32;&#60;&#47;&#115;&#116;&#114;&#111;&#110;&#103;&#62;&#30340;&#60;&#97;&#32;&#104;&#114;&#101;&#102;&#61;"http://dot.kde.org/1140466742/">访谈</a>。我作为valgrind的老用户，当年调程序时获益很多，在这篇访谈里进一步长了见识，深感有必要把这个优秀的开发工具介绍给诸位。以下内容多翻译自该访谈（意译啦）。<br>
<h4>啥是valgrind</h4>
&nbsp;&nbsp;&nbsp; Valgrind是帮助程序员寻找程序里的bug和改进程序性能的工具。程序通过valgrind运行时，valgrind收集各种有用的信息，通过这些信息可以找到程序中潜在的bug和性能瓶颈。<br>&nbsp;&nbsp;&nbsp; Valgrind现在提供多个工具，其中最重要的是Memcheck，Cachegrind，Massif和Callgrind。<br>
<h4>Memcheck：</h4>
&nbsp;&nbsp;&nbsp;
这个工具可以用来寻找c、c++和fortran程序中内存管理的错误。写c或c++程序时，很多隐藏很深的bug是内存操作上出了问题。而这些在
Memcheck面前都无处遁形（偶当年用的就是这个功能）。Memcheck可以检查出下列几种内存操作上的错误（大家自查一下有没有犯过;）：<br>
<ul>
    <li>读写已经释放的内存</li>
    <li>读写内存块越界（从前或者从后）</li>
    <li>使用还未初始化的变量</li>
    <li>将无意义的参数传递给系统调用</li>
    <li>内存泄漏</li>
    <li>（笔者补充一条，同一个malloc的内存块释放多次。当年这么个bug让我找翻天）&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; <br></li>
</ul>
<h4>Cachegrind：</h4>
&nbsp;&nbsp;&nbsp;
这个工具可以提供详尽的profiling信息。它不光对指令、内存访问进行计数，更能针对每条指令、每行源代码、每个函数和每个程序统计cache的不
命中次数。大家应该知道，cache对目前系统的性能有决定性的影响。因此这些信息可以指导程序员调整代码，最大限度的提高程序性能。<br>&nbsp;&nbsp;&nbsp; 访谈中提到，valgrind自身利用该工具在过去几个月内使性能提高了25%-30%。据早先报道，kde的开发team也对valgrind在提高kde性能方面的帮助表示感谢。<br>
<h4>Massif：</h4>
<p>&nbsp;&nbsp;&nbsp; Massif对内存的分配和释放做profile。程序开发者通过它可以深入了解程序的内存使用行为，从而对内存使用进行优化。这个功能对C++尤其有用（因为C++有很多隐藏的内存分配和释放）。</p>
<h4>Callgrind：</h4>
&nbsp;&nbsp;&nbsp; Callgrind是一个复杂的工具（复杂到笔者没看太明白有关它的介绍）。它基于Cachegrind，除了具有Cachegrind的功能外，还可以统计调用带来的开销。<br>
<h4>用法：</h4>
&nbsp;&nbsp;&nbsp; Valgrind使用起来非常简单，你甚至不需要重新编译你的程序就可以用它。当然如果要达到最好的效果，获得最准确的信息，还是需要按要求重新编译一下的。比如在使用memcheck的时候，最好关闭优化选项。
<br><img src ="http://www.cppblog.com/michaelgao/aggbug/72812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2009-02-02 16:50 <a href="http://www.cppblog.com/michaelgao/archive/2009/02/02/72812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 出错处理</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/19/54018.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Thu, 19 Jun 2008 07:24:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/19/54018.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/54018.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/19/54018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/54018.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/54018.html</trackback:ping><description><![CDATA[linux 出错处理<br>　　常用的内容如下：<br>　　l         &lt;assert.h&gt;中支持assert()函数，注意，assert()检查发现条件不成立时调用abort()终止程序执行，应用程序没有机会做清除工作。<br>　　l         C标准定义了__LINE__和__FILE__宏，GNU C扩展中定义了__FUNCTION__宏。<br>　　l         &lt;errno.h&gt;中定义了errno，注意没有函数会将errno清零，所以在调用可能设置errno的函数之前先将errno清零。<br>　　l         &lt;stdlib.h&gt;中定义了abort()、exit()和atexit()函数。<br>　　l         函数abort()将导致程序异常终止，在终止前程序没有机会执行atexit()登记的函数，也没有计划执行一些常规的清除工作。同时，abort()还会产生core dump，如果没有ulimit限制的话。<br>　　l         函数exit()和abort()类似，但它在完成清理工作之后才终止程序。<br>　　l         函数atexit()登记在程序正常终止时要调用的函数。<br>　　l         &lt;stdio.h&gt;中定义了perror()，&lt;string.h&gt;中定义了strerror()。<br>　　l         &lt;syslog.h&gt;中定义了syslogd的接口。 <br><br><br>同样的情况下,windows下错误用的是getlasterror( )<br><br><img src ="http://www.cppblog.com/michaelgao/aggbug/54018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-19 15:24 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/19/54018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++存储区</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/18/53881.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Wed, 18 Jun 2008 08:21:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/18/53881.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/53881.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/18/53881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/53881.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/53881.html</trackback:ping><description><![CDATA[一.在c中分为这几个存储区 &nbsp; <br> &nbsp; 1.栈 &nbsp; - &nbsp; 有编译器自动分配释放 &nbsp; <br> &nbsp; 2.堆 &nbsp; - &nbsp; 一般由程序员分配释放，若程序员不释放，程序结束时可能由OS回收 &nbsp; <br> &nbsp; 3.全局区（静态区），全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域，未初始化的全局变量和未初始化的静态变量在相邻的&gt;另一块区域。- &nbsp; 程序结束释放 &nbsp; <br> &nbsp; 4.另外还有一个专门放常量的地方。 &nbsp; - &nbsp; 程序结束释放 &nbsp; <br> &nbsp; 二.在C++中，内存分成5个区，他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 &nbsp; <br> &nbsp; 1.栈，就是那些由编译器在需要的时候分配，在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 &nbsp; <br><clk>&nbsp;2.堆，就是那些由new分配的内存块，他们的释放编译器不去管，由<nobr id="clickeyekey0" style="border-bottom: 1px dotted #6600ff; text-decoration: underline; color: #6600ff; background-color: transparent;" target="_blank" oncontextmenu="return false;" onmouseover="kwE(event,0, this);" onmouseout="kwL(event,this)" onmousemove="kwM(0);">我们</nobr>的应用程序去控制，一般一个new就要对应一个delete。如果程序员没有释放掉，那么在程&gt;序结束后，操作系统会自动回收。 &nbsp; </clk><br> &nbsp; 3.自由存储区，就是那些由malloc等分配的内存块，他和堆是十分相似的，不过它是用free来结束自己的生命的。 &nbsp; <br> &nbsp; 4.全局/静态存储区，全局变量和静态变量被分配到同一块内存中，在以前的C语言中，全局变量又分为初始化的和未初始化的，在C++里面没有这个区分了，他们共同占用同一块内存区。 &nbsp; <br> &nbsp; 5.常量存储区，这是一块比较特殊的存储区，他们里面存放的是常量，不允许修改（当然，你要通过非正当手段也可以修改） &nbsp; <br> &nbsp; 所以静态变量和全局变量放在全局/静态存储区,而常量存放在常量存储区,程序代码当然放在代码区了~~
<br><img src ="http://www.cppblog.com/michaelgao/aggbug/53881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-18 16:21 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/18/53881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>