﻿<?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++博客-无名工匠</title><link>http://www.cppblog.com/Wealth/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 04 Dec 2008 01:22:03 GMT</lastBuildDate><pubDate>Thu, 04 Dec 2008 01:22:03 GMT</pubDate><ttl>60</ttl><item><title>初探数据表现层和业务逻辑层的分离</title><link>http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Mon, 30 Jun 2008 11:27:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/54977.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/54977.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/54977.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 分离数据表现形式和业务逻辑计算这两个软件部件一直在脑海孕育，但总是没有实现出来。周末以MP3播放器为例，对分离这两者做了一个初步的探索。&nbsp;&nbsp;<a href='http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html'>阅读全文</a><img src ="http://www.cppblog.com/Wealth/aggbug/54977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-30 19:27 <a href="http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从wave文件的读写看程序中struct的设计</title><link>http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Mon, 16 Jun 2008 03:00:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/53507.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/53507.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/53507.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 字节未对齐的结构也是个潜在的缺陷。程序中设计的结构应该尽量保持字节对齐。&nbsp;&nbsp;<a href='http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html'>阅读全文</a><img src ="http://www.cppblog.com/Wealth/aggbug/53507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-16 11:00 <a href="http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt中的new和delete</title><link>http://www.cppblog.com/Wealth/archive/2008/06/04/52128.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Wed, 04 Jun 2008 02:49:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/04/52128.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/52128.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2008/06/04/52128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/52128.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/52128.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Qt中的父类能自动删除其所有孩子在堆上分配的内存&nbsp;&nbsp;<a href='http://www.cppblog.com/Wealth/archive/2008/06/04/52128.html'>阅读全文</a><img src ="http://www.cppblog.com/Wealth/aggbug/52128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-04 10:49 <a href="http://www.cppblog.com/Wealth/archive/2008/06/04/52128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Valgrind手册翻译</title><link>http://www.cppblog.com/Wealth/archive/2008/06/04/52118.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Wed, 04 Jun 2008 01:40:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/04/52118.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/52118.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2008/06/04/52118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/52118.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/52118.html</trackback:ping><description><![CDATA[<p>名字：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valgrind是一个调试和剖析的程序工具集。</p>
<p>概要用法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valgrind [[valgrind] [options]] [your-program] [[your-program-options]]</p>
<p>概述：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valgrind是一个Linux下灵活的调试和剖析可执行工具。它由在软件层提供综合的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPU内核,和一系列调试、剖析的工具组成。架构是模块化的，所以可以在不破坏现<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有的结构的基础上很容易的创建出新的工具来。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这本手册包括了基本的用法和选项。更多帮助理解的信息，请查看您系统的HTML<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文档：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　/usr/share/doc/valgrind/html/index.html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或者在线文档：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<a href="http://www.valgrind.org/docs/manual/index.html">http://www.valgrind.org/docs/manual/index.html</a>.</p>
<p>用法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般像下面这样调用Valgrind:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valgrind program args</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样将在Valgrind使用Memcheck运行程序program(带有参数args)。内存检查<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行一系列的内存检查功能，包括检测访问未初始化的内存，已经分配内存的错误<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用(两次释放，释放后再访问，等等)并检查内存泄漏。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可用--tool指定使用其它工具：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valgrind --tool=toolname program args</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可使用的工具如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o cachegrind是一个缓冲模拟器。它可以用来标出你的程序每一行执行的指令<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数和导致的缓冲不命中数。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o callgrind在cachegrind基础上添加调用追踪。它可以用来得到调用的次数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以及每次函数调用的开销。作为对cachegrind的补充，callgrind可以分别<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标注各个线程，以及程序反汇编输出的每条指令的执行次数以及缓存未命中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o helgrind能够发现程序中潜在的条件竞争。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o lackey是一个示例程序，以其为模版可以创建你自己的工具。在程序结束后，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它打印出一些基本的关于程序执行统计数据。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o massif是一个堆剖析器，它测量你的程序使用了多少堆内存。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o memcheck是一个细粒度的的内存检查器。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o none没有任何功能。它它一般用于Valgrind的调试和基准测试。</p>
<p>基本选项：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这些选项对所有工具都有效。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -h --help<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示所有选项的帮助，包括内核和选定的工具两者。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --help-debug<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和--help相同，并且还能显示通常只有Valgrind的开发人员使用的调试<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选项。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --version<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示Valgrind内核的版本号。工具可以有他们自已的版本号。这是一种<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 保证工具只在它们可以运行的内核上工作的一种设置。这样可以减少在<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工具和内核之间版本兼容性导致奇怪问题的概率。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -q --quiet<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安静的运行，只打印错误信息。在进行回归测试或者有其它的自动化测<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 试机制时会非常有用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -v --verbose<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示详细信息。在各个方面显示你的程序的额外信息，例如：共享对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加载，使用的重置，执行引擎和工具的进程，异常行为的警告信息。重<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 复这个标记可以增加详细的级别。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -d&nbsp;&nbsp;&nbsp;&nbsp; 调试Valgrind自身发出的信息。通常只有Valgrind开发人员对此感兴趣。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重复这个标记可以产生更详细的输出。如果你希望发送一个bug报告，通<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 过-v -v -d -d生成的输出会使你的报告更加有效。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --tool=&lt;toolname&gt; [default: memcheck]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行toolname指定的Valgrind，例如，Memcheck, Addrcheck, Cachegrind,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 等等。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --trace-children=&lt;yes|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个选项打开时，Valgrind会跟踪到子进程中。这经常会导致困惑，而<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 且通常不是你所期望的，所以默认这个选项是关闭的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --track-fds=&lt;yes|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个选项打开时，Valgrind会在退出时打印一个打开文件描述符的列表。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个文件描述符都会打印出一个文件是在哪里打开的栈回溯，和任何与此<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件描述符相关的详细信息比如文件名或socket信息。</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --time-stamp=&lt;yes|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个选项打开时，每条信息之前都有一个从程序开始消逝的时间，用天，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小时，分钟，秒和毫秒表示。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --log-fd=&lt;number&gt; [default: 2, stderr]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定Valgrind把它所有的消息都输出到一个指定的文件描述符中去。默认值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,　是标准错误输出(stderr)。注意这可能会干扰到客户端自身对stderr<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的使用, Valgrind的输出与客户程序的输出将穿插在一起输出到stderr。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --log-file=&lt;filename&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定Valgrind把它所有的信息输出到指定的文件中。实际上，被创建文件的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件名是由filename、'.'和进程号连接起来的（即&lt;filename&gt;.&lt;pid&gt;），<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从而每个进程创建不同的文件。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --log-file-exactly=&lt;filename&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类似于--log-file，但是后缀".pid"不会被添加。如果设置了这个选项，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用Valgrind跟踪多个进程，可能会得到一个乱七八糟的文件。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --log-file-qualifier=&lt;VAR&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当和--log-file一起使用时，日志文件名将通过环境变量$VAR来筛选。这<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于MPI程序是有益的。更多的细节，查看手册2.3节 "注解"。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --log-socket=&lt;ip-address:port-number&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定Valgrind输出所有的消息到指定的IP，指定的端口。当使用1500端口<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时，端口有可能被忽略。如果不能建立一个到指定端口的连接，Valgrind<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将输出写到标准错误(stderr)。这个选项经常和一个Valgrind监听程序一<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 起使用。更多的细节，查看手册2.3节 "注解"。</p>
<p><br>错误相关选项：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这些选项适用于所有产生错误的工具，比如Memcheck,　但是Cachegrind不行。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --xml=&lt;yes|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个选项打开时，输出将是XML格式。这是为了使用Valgrind的输出做为<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入的工具，例如GUI前端更加容易些。目前这个选项只在Memcheck时生效。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --xml-user-comment=&lt;string&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在XML开头 附加用户注释，仅在指定了--xml=yes时生效，否则忽略。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --demangle=&lt;yes|no&gt; [default: yes]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开/关闭C++的名字自动解码。默认打开。当打开时，Valgrind将尝试着把<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编码过的C++名字自动转回初始状态。这个解码器可以处理g++版本为2.X,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.X或4.X生成的符号。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个关于名字编码解码重要的事实是，禁止文件中的解码函数名仍然使用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 他们未解码的形式。Valgrind在搜寻可用的禁止条目时不对函数名解码，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为这将使禁止文件内容依赖于Valgrind的名字解码机制状态， 会使速度<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变慢，且无意义。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --num-callers=&lt;number&gt; [default: 12]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认情况下，Valgrind显示12层函数调用的函数名有助于确定程序的位置。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以通过这个选项来改变这个数字。这样有助在嵌套调用的层次很深时确定<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序的位置。注意错误信息通常只回溯到最顶上的4个函数。(当前函数，和<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它的3个调用者的位置)。所以这并不影响报告的错误总数。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个值的最大值是50。注意高的设置会使Valgrind运行得慢，并且使用更多<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的内存,但是在嵌套调用层次比较高的程序中非常实用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --error-limit=&lt;yes|no&gt; [default: yes]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个选项打开时，在总量达到10,000,000，或者1,000个不同的错误，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valgrind停止报告错误。这是为了避免错误跟踪机制在错误很多的程序<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下变成一个巨大的性能负担。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --error-exitcode=&lt;number&gt; [default: 0]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定如果Valgrind在运行过程中报告任何错误时的退出返回值，有两种情<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 况；当设置为默认值(零)时，Valgrind返回的值将是它模拟运行的程序的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回值。当设置为非零值时，如果Valgrind发现任何错误时则返回这个值。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Valgrind做为一个测试工具套件的部分使用时这将非常有用，因为使测<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 试工具套件只检查Valgrind返回值就可以知道哪些测试用例Valgrind报告<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 了错误。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --show-below-main=&lt;yes|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认地，错误时的栈回溯不显示main()之下的任何函数(或者类似的函数像<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glibc的__libc_start_main()，如果main()没有出现在栈回溯中)；这些大<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 部分都是令人厌倦的C库函数。如果打开这个选项，在main()之下的函数也<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将会显示。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --suppressions=&lt;filename&gt; [default: $PREFIX/lib/valgrind/default.supp]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定一个额外的文件读取不需要理会的错误；你可以根据需要使用任意多<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的额外文件。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --gen-suppressions=&lt;yes|no|all&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当设置为yes时，Valgrind将会在每个错误显示之后自动暂停并且打印下<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 面这一行：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---- Print suppression ? --- [Return/N/n/Y/y/C/c] ----</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个提示的行为和--db-attach选项(见下面)相同。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果选择是，Valgrind会打印出一个错误的禁止条目，你可以把它剪切然后<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 粘帖到一个文件，如果不希望在将来再看到这个错误信息。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当设置为all时，Valgrind会对每一个错误打印一条禁止条目，而不向用户<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 询问。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个选项对C++程序非常有用，它打印出编译器调整过的名字。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意打印出来的禁止条目是尽可能的特定的。如果需要把类似的条目归纳<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 起来，比如在函数名中添加通配符。并且，有些时候两个不同的错误也会<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 产生同样的禁止条目，这时Valgrind就会输出禁止条目不止一次，但是在<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 禁止条目的文件中只需要一份拷贝(但是如果多于一份也不会引起什么问<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 题)。并且，禁止条目的名字像&lt;在这儿输入一个禁止条目的名字&gt;;名字并<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不是很重要，它只是和-v选项一起使用打印出所有使用的禁止条目记录。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --db-attach=&lt;yes|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个选项打开时，Valgrind将会在每次打印错误时暂停并打出如下<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一行：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ----</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按下回车,或者N、回车，n、回车，Valgrind不会对这个错误启动调试器。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按下Y、回车，或者y、回车，Valgrind会启动调试器并设定在程序运行的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个点。当调试结束时，退出，程序会继续运行。在调试器内部尝试继续<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行程序，将不会生效。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按下C、回车，或者c、回车，Valgrind不会启动一个调试器，并且不会再<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 次询问。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：--db-attach=yes与--trace-children=yes有冲突。你不能同时使用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它们。Valgrind在这种情况下不能启动。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2002.05: 这是一个历史的遗留物，如果这个问题影响到你，请发送邮件并<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 投诉这个问题。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2002.11:如果你发送输出到日志文件或者到网络端口，我猜这不会让你有<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任何感觉。不须理会。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --db-command=&lt;command&gt; [default: gdb -nw %f %p]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过--db-attach指定如何使用调试器。默认的调试器是gdb.默认的选项<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是一个运行时扩展Valgrind的模板。 %f会用可执行文件的文件名替换，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %p会被可执行文件的进程ID替换。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这指定了Valgrind将怎样调用调试器。默认选项不会因为在构造时是否检<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 测到了GDB而改变,通常是/usr/bin/gdb.使用这个命令，你可以指定一些<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用其它的调试器来替换。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给出的这个命令字串可以包括一个或多个%p %f扩展。每一个%p实例都被<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解释成将调试的进程的PID，每一个%f实例都被解释成要调试的进程的可<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行文件路径。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --input-fd=&lt;number&gt; [default: 0, stdin]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用--db-attach=yes和--gen-suppressions=yes选项，在发现错误时，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valgrind会停下来去读取键盘输入。默认地，从标准输入读取，所以关闭<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 了标准输入的程序会有问题。这个选项允许你指定一个文件描述符来替代<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标准输入读取。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --max-stackframe=&lt;number&gt; [default: 2000000]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 栈的最大值。如果栈指针的偏移超过这个数量，Valgrind则会认为程序是<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 切换到了另外一个栈执行。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果在程序中有大量的栈分配的数组，你可能需要使用这个选项。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valgrind保持对程序栈指针的追踪。如果栈指针的偏移超过了这个数量，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valgrind假定你的程序切换到了另外一个栈，并且Memcheck行为与栈指<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 针的偏移没有超出这个数量将会不同。通常这种机制运转得很好。然而，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你的程序在栈上申请了大的结构，这种机制将会表现得愚蠢，并且<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Memcheck将会报告大量的非法栈内存访问。这个选项允许把这个阀值设置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为其它值。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 应该只在Valgrind的调试输出中显示需要这么做时才使用这个选项。在这<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 种情况下，它会告诉你应该指定的新的阀值。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 普遍地，在栈中分配大块的内存是一个坏的主意。因为这很容易用光你的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 栈空间，尤其是在内存受限的系统或者支持大量小堆栈的线程的系统上，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为Memcheck执行的错误检查，对于堆上的数据比对栈上的数据要高效<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 很多。如果你使用这个选项，你可能希望考虑重写代码在堆上分配内存<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而不是在栈上分配。<br><br>MALLOC()相关的选项:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于使用自有版本的malloc() (例如Memcheck和massif)，下面的选项可以使用。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --alignment=&lt;number&gt; [default: 8]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认Valgrind的malloc(),realloc(), 等等，是8字节对齐地址的。这<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是大部分处理器的标准。然而，一些程序可能假定malloc()等总是返回<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16字节或更多对齐的内存。提供的数值必须在8和4096区间之内，并且<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须是2的幂数。</p>
<p>非通用选项：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这些选项可以用于所有的工具，它们影响Valgrind core的几个特性。大部分人不<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会用到这些选项。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --run-libc-freeres=&lt;yes|no&gt; [default: yes]<br>　　　　　　　GNU C库(libc.so)，所有程序共用的，可能会分配一部分内存自已用。通<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 常在程序退出时释放内存并不麻烦 -- 这里没什么问题，因为Linux内核在<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个进程退出时会回收进程全部的资源，所以这只是会造成速度慢。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glibc的作者认识到这样会导致内存检查器，像Valgrind，在退出时检查<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 内存错误的报告glibc的内存泄漏问题，为了避免这个问题，他们提供了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个__libc_freeres()例程特别用来让glibc释放分配的所有内存。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此Memcheck在退出时尝试着去运行__libc_freeres()。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不幸的是，在glibc的一些版本中，__libc_freeres是有bug会导致段错误的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这在Red Hat 7.1上有特别声明。所以，提供这个选项来决定是否运行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __libc_freeres。如果你的程序看起来在Valgrind上运行得很好，但是在<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 退出时发生段错误，你可能需要指定--run-libc-freeres=no来修正，这将<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可能错误的报告libc.so的内存泄漏。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --sim-hints=hint1,hint2,...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传递杂凑的提示给Valgrind，轻微的修改模拟行为的非标准或危险方式，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可能有助于模拟奇怪的特性。默认没有提示打开。小心使用！目前已知<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的提示有：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o lax-ioctls: 对ioctl的处理非常不严格，唯一的假定是大小是正确的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不需要在写时缓冲区完全的初始化。没有这个，用大量的奇怪的ioctl<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命令来使用一些设备驱动将会非常烦人。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o enable-inner:打开某些特殊的效果，当运行的程序是Valgrind自身时。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --kernel-variant=variant1,variant2,...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 处理系统调用和ioctls在这个平台的默认核心上产生不同的变量。这有助<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 于运行在改进过的内核或者支持非标准的ioctls上。小心使用。如果你不<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 理解这个选项做的是什么那你几乎不需要它。已经知道的变量有：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o bproc: 支持X86平台上的sys_broc系统调用。这是为了运行在BProc，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它是标准Linux的一个变种，有时用来构建集群。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --show-emwarns=&lt;yes|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个选项打开时，Valgrind在一些特定的情况下将对CPU仿真产生警告。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常这些都是不引人注意的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --smc-check=&lt;none|stack|all&gt; [default: stack]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个选项控制Valgrind对自我修改的代码的检测。Valgrind可以不做检测，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以检测栈中自我修改的代码，或者任意地方检测自我修改的代码。注意<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认选项是捕捉绝大多数情况，到目前我们了解的情况为止。使用all选项<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时会极大的降低速度。(但是用none选项运行极少影响速度，因为对大多数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序，非常少的代码被添加到栈中)</p>
<p><br>调试VALGRIND选项：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还有一些选项是用来调试Valgrind自身的。在运行一般的东西时不应该需要的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你希望看到选项列表，使用--help-debug选项。</p>
<p>内存检查选项：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --leak-check=&lt;no|summary|yes|full&gt; [default: summary]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个选项打开时，当客户程序结束时查找内存泄漏。内存泄漏意味着<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有用malloc分配内存块，但是没有用free释放，而且没有指针指向这块<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 内存。这样的内存块永远不能被程序释放，因为没有指针指向它们。如<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 果设置为summary，Valgrind会报告有多少内存泄漏发生了。如果设置为<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; full或yes，Valgrind给出每一个独立的泄漏的详细信息。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --show-reachable=&lt;yes|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个选项关闭时，内存泄漏检测器只显示没有指针指向的内存块，或<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 者只能找到指向块中间的指针。当这个选项打开时，内存泄漏检测器还<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 报告有指针指向的内存块。这些块是最有可能出现内存泄漏的地方。你<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的程序可能，至少在原则上，应该在退出前释放这些内存块。这些有指<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 针指向的内存块和没有指针指向的内存块，或者只有内部指针指向的块，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 都可能产生内存泄漏，因为实际上没有一个指向块起始的指针可以拿来释<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 放，即使你想去释放它。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --leak-resolution=&lt;low|med|high&gt; [default: low]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在做内存泄漏检查时，确定memcheck将怎么样考虑不同的栈是相同的情况。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当设置为low时，只需要前两层栈匹配就认为是相同的情况；当设置为med，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须要四层栈匹配，当设置为high时，所有层次的栈都必须匹配。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于hardcore内存泄漏检查，你很可能需要使用--leak-resolution=high和<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --num-callers=40或者更大的数字。注意这将产生巨量的信息，这就是为什<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 么默认选项是四个调用者匹配和低分辨率的匹配。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意--leak-resolution= 设置并不影响memcheck查找内存泄漏的能力。它<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只是改变了结果如何输出。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --freelist-vol=&lt;number&gt; [default: 5000000]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当客户程序使用free(C中)或者delete(C++)释放内存时，这些内存并不是<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 马上就可以用来再分配的。这些内存将被标记为不可访问的，并被放到一<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 个已释放内存的队列中。这样做的目的是，使释放的内存再次被利用的点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 尽可能的晚。这有利于memcheck在内存块释放后这段重要的时间检查对块<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不合法的访问。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个选项指定了队列所能容纳的内存总容量，以字节为单位。默认的值是<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000000字节。增大这个数目会增加memcheck使用的内存，但同时也增加了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对已释放内存的非法使用的检测概率。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --workaround-gcc296-bugs=&lt;yes|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个选项打开时，假定读写栈指针以下的一小段距离是gcc 2.96的bug，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并且不报告为错误。距离默认为256字节。注意gcc 2.96是一些比较老的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linux发行版(RedHat 7.X)的默认编译器，所以你可能需要使用这个选项。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果不是必要请不要使用这个选项，它可能会使一些真正的错误溜掉。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个更好的解决办法是使用较新的，修正了这个bug的gcc/g++版本。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --partial-loads-ok=&lt;yes|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 控制memcheck如何处理从地址读取时字长度，字对齐，因此哪些字节是可<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以寻址的，哪些是不可以寻址的。当设置为yes是，这样的读取并不抛出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个寻址错误。而是从非法地址读取的V字节显示为未定义，访问<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 合法地址仍然是像平常一样映射到内存。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置为no时，从部分错误的地址读取与从完全错误的地址读取同样处理：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 抛出一个非法地址错误，结果的V字节显示为合法数据。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意这种代码行为是违背ISO C/C++标准，应该被认为是有问题的。如果可<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 能，这种代码应该修正。这个选项应该只是做为一个最后考虑的方法。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --undef-value-errors=&lt;yes|no&gt; [default: yes]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 控制memcheck是否检查未定义值的危险使用。当设为yes时，Memcheck的行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为像Addrcheck, 一个轻量级的内存检查工具，是Valgrind的一个部分，它<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并不检查未定义值的错误。使用这个选项，如果你不希望看到未定义值错误。</p>
<p><br>CACHEGRIND选项：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 手动指定I1/D1/L2缓冲配置，大小是用字节表示的。这三个必须用逗号隔开，中间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 没有空格，例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valgrind --tool=cachegrind --I1=65535,2,64</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可以指定一个，两个或三个I1/D1/L2缓冲。如果没有手动指定，每个级别使用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 普通方式(通过CPUID指令得到缓冲配置，如果失败，使用默认值)得到的配置。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --I1=&lt;size&gt;,&lt;associativity&gt;,&lt;line size&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定第一级指令缓冲的大小，关联度和行大小。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --D1=&lt;size&gt;,&lt;associativity&gt;,&lt;line size&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定第一级数据缓冲的大小，关联度和行大小。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --L2=&lt;size&gt;,&lt;associativity&gt;,&lt;line size&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定第二级缓冲的大小，关联度和行大小。</p>
<p>CALLGRIND选项：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --heap=&lt;yes|no&gt; [default: yes]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个选项打开时，详细的追踪堆的使用情况。关闭这个选项时，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; massif.pid.txt或massif.pid.html将会非常的简短。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --heap-admin=&lt;number&gt; [default: 8]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个块使用的管理字节数。这只能使用一个平均的估计值，因为它可能变化。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glibc使用的分配器每块需要4~15字节，依赖于各方面的因素。管理已经释放<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的块也需要空间，尽管massif不计算这些。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --stacks=&lt;yes|no&gt; [default: yes]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当打开时，在剖析信息中包含栈信息。多线程的程序可能有多个栈。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --depth=&lt;number&gt; [default: 3]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 详细的堆信息中调用过程的深度。增加这个值可以给出更多的信息，但是<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; massif会更使这个程序运行得慢，使用更多的内存，并且产生一个大的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; massif.pid.txt或者massif.pid.hp文件。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --alloc-fn=&lt;name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定一个分配内存的函数。这对于使用malloc()的包装函数是有用的，可以<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用它来填充原来无效的上下文信息。(这些函数会给出无用的上下文信息，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并在图中给出无意义的区域)。指定的函数在上下文中被忽略，例如，像对<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; malloc()一样处理。这个选项可以在命令行中重复多次，指定多个函数。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --format=&lt;text|html&gt; [default: text]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 产生text或者HTML格式的详细堆信息，文件的后缀名使用.txt或者.html。</p>
<p>HELGRIND选项：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --private-stacks=&lt;yes|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假定线程栈是私有的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --show-last-access=&lt;yes|some|no&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示最后一次字访问出错的位置。</p>
<p>LACKEY选项：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --fnname=&lt;name&gt; [default: _dl_runtime_resolve()]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对&lt;name&gt;函数计数。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --detailed-counts=&lt;no|yes&gt; [default: no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对读取，存储和alu操作计数。</p>
<p>参考：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/share/doc/valgrind/html/index.html, 和/或者<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.valgrind.org/docs/manual/index.html">http://www.valgrind.org/docs/manual/index.html</a>.</p>
<p>作者信息：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Julian Seward &lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#115;&#101;&#119;&#97;&#114;&#100;&#64;&#97;&#99;&#109;&#46;&#111;&#114;&#103;">jseward@acm.org</a>&gt;是Valgrind的初始作者，在<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/share/doc/valgrind/AUTHORS还有其他的贡献者的信息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这份手册由Andres Roldan &lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#114;&#111;&#108;&#100;&#97;&#110;&#64;&#100;&#101;&#98;&#105;&#97;&#110;&#46;&#111;&#114;&#103;">aroldan@debian.org</a>&gt;为Debian工程编写，但是可以在<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任何其它发行版上使用。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.4.0版本的更新，重排，和扩展由Robert Walsh &lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#114;&#106;&#119;&#97;&#108;&#115;&#104;&#64;&#100;&#117;&#114;&#97;&#98;&#108;&#101;&#115;&#46;&#111;&#114;&#103;">rjwalsh@durables.org</a>&gt;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后来由其它的Valgrind开发者完成。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本手册的翻译工作由邓杰和庄礼深同学共同完成。<br></p>
<img src ="http://www.cppblog.com/Wealth/aggbug/52118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-04 09:40 <a href="http://www.cppblog.com/Wealth/archive/2008/06/04/52118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fcntl函数</title><link>http://www.cppblog.com/Wealth/archive/2008/06/02/51884.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Mon, 02 Jun 2008 06:41:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/02/51884.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/51884.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2008/06/02/51884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/51884.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/51884.html</trackback:ping><description><![CDATA[<p>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该函数可以改变已打开的文件的性质。<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">fcntl.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_63_75_Open_Image onclick="this.style.display='none'; Codehighlighter1_63_75_Open_Text.style.display='none'; Codehighlighter1_63_75_Closed_Image.style.display='inline'; Codehighlighter1_63_75_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_63_75_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_75_Closed_Text.style.display='none'; Codehighlighter1_63_75_Open_Image.style.display='inline'; Codehighlighter1_63_75_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;fcntl(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;fields,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;cmd,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_63_75_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_63_75_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;int&nbsp;arg&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">若成功则依赖于cmd,若出错则返回-1</span></div>
<p>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第三个参数总是一个整数，与上面所示函数原型中的注释部分相对应。但是在作为记录锁用时，第三个参数则是指向一个结构的指针。<br>&nbsp;&nbsp; fcntl函数有5种功能：<br>&nbsp;&nbsp;&nbsp;&nbsp; 1.复制一个现有的描述符（cmd = F_DUPFD）.<br>&nbsp;&nbsp;&nbsp;&nbsp; 2.获得／设置文件描述符标记(cmd = F_GETFD || F_SETFD).<br>&nbsp;&nbsp;&nbsp;&nbsp; 3.获得／设置文件状态标记(cmd = F_GETFL || F_SETFL).<br>&nbsp;&nbsp;&nbsp;&nbsp; 4.获得／设置异步I/O所有权(cmd = F_GETOWN || F_SETOWN).<br>&nbsp;&nbsp;&nbsp;&nbsp; 5.获得／设置记录锁(cmd = F_GETLK, F_SETLK || F_SETLKW).</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">fcntl.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">errno.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img id=Codehighlighter1_133_740_Open_Image onclick="this.style.display='none'; Codehighlighter1_133_740_Open_Text.style.display='none'; Codehighlighter1_133_740_Closed_Image.style.display='inline'; Codehighlighter1_133_740_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_133_740_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_133_740_Closed_Text.style.display='none'; Codehighlighter1_133_740_Open_Image.style.display='inline'; Codehighlighter1_133_740_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_133_740_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_133_740_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;fd,&nbsp;var;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">fd&nbsp;=&nbsp;open("new",O_RDWR);</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(argc&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img id=Codehighlighter1_195_247_Open_Image onclick="this.style.display='none'; Codehighlighter1_195_247_Open_Text.style.display='none'; Codehighlighter1_195_247_Closed_Image.style.display='inline'; Codehighlighter1_195_247_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_195_247_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_195_247_Closed_Text.style.display='none'; Codehighlighter1_195_247_Open_Image.style.display='inline'; Codehighlighter1_195_247_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_195_247_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_195_247_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">请输入参数，即文件名！</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((var&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fcntl(atoi(argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]),&nbsp;F_GETFL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">))&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img id=Codehighlighter1_302_363_Open_Image onclick="this.style.display='none'; Codehighlighter1_302_363_Open_Text.style.display='none'; Codehighlighter1_302_363_Closed_Image.style.display='inline'; Codehighlighter1_302_363_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_302_363_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_302_363_Closed_Text.style.display='none'; Codehighlighter1_302_363_Open_Image.style.display='inline'; Codehighlighter1_302_363_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_302_363_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_302_363_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strerror(errno);<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">fcntl&nbsp;file&nbsp;error.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">&nbsp;(var&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;O_ACCMODE)<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img id=Codehighlighter1_393_591_Open_Image onclick="this.style.display='none'; Codehighlighter1_393_591_Open_Text.style.display='none'; Codehighlighter1_393_591_Closed_Image.style.display='inline'; Codehighlighter1_393_591_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_393_591_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_393_591_Closed_Text.style.display='none'; Codehighlighter1_393_591_Open_Image.style.display='inline'; Codehighlighter1_393_591_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_393_591_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_393_591_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;O_RDONLY&nbsp;:&nbsp;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Read&nbsp;only..</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;O_WRONLY&nbsp;:&nbsp;<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Write&nbsp;only..</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;O_RDWR&nbsp;&nbsp;&nbsp;:&nbsp;<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Read&nbsp;wirte..</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">&nbsp;&nbsp;:&nbsp;<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(val&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;O_APPEND)<br></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,append</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(val&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;O_NONBLOCK)<br></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,noblocking</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">48</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">exit&nbsp;0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">50</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">51</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">52</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">53</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fcntl文件锁有两种类型：建议性锁和强制性锁<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建议性锁是这样规定的：每个使用上锁文件的进程都要检查是否有锁存在，当然还得尊重已有的锁。内核和系统总体上都坚持不使用建议性锁，它们依靠程序员遵守这个规定。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 强制性锁是由内核执行的。当文件被上锁来进行写入操作时，在锁定该文件的进程释放该锁之前，内核会阻止任何对该文件的读或写访问，每次读或写访问都得检查锁是否存在。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统默认fcntl都是建议性锁，强制性锁是非POSIX标准的。如果要使用强制性锁，要使整个系统可以使用强制性锁，那么得需要重新挂载文件系统， mount使用参数 -0 mand打开强制性锁，或者关闭已加锁文件的组执行权限并且打开该文件的set-GID权限位。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建议性锁只在cooperating processes之间才有用，对cooperating process的理解是最重要的，它指的是会影响其它进程的进程或被别的进程所影响的进程，举两个例子：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）我们可以同时在两个窗口中运行同一个命令，对同一个文件进行操作，那么这两个进程就是cooperating processes；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2） cat file | sort， 那么cat和sort产生的进程就是使用了pipe的cooperating processes。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用fcntl文件锁进行I/O操作必须小心：进程在开始任何I/O操作前如何去处理锁，在对文件解锁前如何完成所有的操作，是必须考虑的。如果在设置锁之前打开文件，或者读取该锁之后关闭文件，另一个进程就可能在上锁/解锁操作和打开/关闭操作之间的几分之一秒内访问该文件。当一个进程对文件加锁后，无论它是否释放所加的锁，只要文件关闭，内核都会自动释放加在文件上的建议性锁（这也是建议性锁和强制性锁的最大区别）, 所以不要想设置建议性锁来达到永久不让别的进程访问文件的目的(强制性锁才可以)；强制性锁则对所有进程起作用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fcntl使用三个参数 F_SETLK/F_SETLKW， F_UNLCK和F_GETLK, 来分别要求、释放、测试record locks。 record locks是对文件一部分而不是整个文件的锁，这种细致的控制使得进程更好地协作以共享文件资源。fcntl能够用于读取锁和写入锁，read lock也叫shared lock（共享锁）, 因为多个cooperating process能够在文件的同一部分建立读取锁；write lock被称为exclusive lock(排斥锁)， 因为任何时刻只能有一个cooperating process在文件的某部分上建立写入锁。如果cooperating processes对文件进行操作，那么它们可以同时对文件加read lock，在一个cooperating process加write lock之前，必须释放别的cooperating process加在该文件的read lock和wrtie lock，也就是说，对于文件只能有一个write lock存在，read lock和wrtie lock不能共存。 <br>&nbsp;<br>&nbsp;<br>&nbsp;<br></p>
<img src ="http://www.cppblog.com/Wealth/aggbug/51884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-02 14:41 <a href="http://www.cppblog.com/Wealth/archive/2008/06/02/51884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>