﻿<?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++博客-面对现实，超越自己-随笔分类-Linux</title><link>http://www.cppblog.com/wanghaiguang/category/19462.html</link><description>逆水行舟，不进则退</description><language>zh-cn</language><lastBuildDate>Fri, 28 Mar 2014 04:56:34 GMT</lastBuildDate><pubDate>Fri, 28 Mar 2014 04:56:34 GMT</pubDate><ttl>60</ttl><item><title>Google开源项目</title><link>http://www.cppblog.com/wanghaiguang/archive/2014/03/28/206373.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Fri, 28 Mar 2014 01:43:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2014/03/28/206373.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/206373.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2014/03/28/206373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/206373.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/206373.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://www.feng5166.com/blog/?tag=google" target="_blank" style="color: #336699; text-decoration: none;">google</a>&nbsp;的<a href="http://www.feng5166.com/blog/?tag=%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE" target="_blank" style="color: #336699; text-decoration: none;">开源项目</a>&nbsp;值 得我们一用的，这些项目很有意义，甚至可以直接用在我们自己的工作上！学习编程的的一个比较好的方式就是阅读优秀项目的源代码，从而能够了解作者的方法、 思路、技巧，另外阅读源代码对于一些朋友是枯燥乏味的，这是就可以看看项目的readme，找到项目的闪光点，我们不做开拓者那我们就做实践者和使用者， 呵呵，下面是这些项目的列表，在这里存档，已备今后查阅之用</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">&nbsp;</p><h4><a name="t0" style="color: rgb(51, 102, 153);"></a><span style="font-size: large;">文本文件处理：</span></h4><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/crush-tools/" target="_blank" style="color: #336699; text-decoration: none;">Google CRUSH (Custom Reporting Utilities for SHell)</a>&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">CRUSH是为命令行或shell scripts处理特定文字数据而制作的一系列工具，<a href="http://code.google.com/p/crush-tools/wiki/CrushTutorial" target="_blank" style="color: #336699; text-decoration: none;">这里有指南</a>。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">C++库和源代码：</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/google-breakpad/" style="color: #336699; text-decoration: none;">Google Breakpad</a>&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">一个开源的多平台崩溃报告系统。&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/google-gflags/" style="color: #336699; text-decoration: none;">Google GFlags</a>&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Gflags是一个命令行标记的处理库，它可以替代&#8220;getopt()&#8221;，其内置对C++的支持比如string。<a href="http://google-gflags.googlecode.com/svn/trunk/doc/gflags.html" target="_blank" style="color: #336699; text-decoration: none;">指南在此</a>&nbsp;。&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/google-glog/" target="_blank" style="color: #336699; text-decoration: none;">Google Glog</a>&nbsp;&nbsp;Glog库可执行应用级的登陆，提供基于C++式的登陆API，可用于Linux、BSD和Windows。<a href="http://google-glog.googlecode.com/svn/trunk/doc/glog.html" target="_blank" style="color: #336699; text-decoration: none;">指南见此</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/google-perftools/" target="_blank" style="color: #336699; text-decoration: none;">Google PerfTools</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">这个工具可让开发创建更强大的应用程序，特别是那些用C++模版开发的多线程应用程序，包括TCMalloc, heap-checker, heap-profiler 和cpu-profiler。指南<a href="http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools" target="_blank" style="color: #336699; text-decoration: none;">见此</a>&nbsp;还有<a href="http://google-perftools.googlecode.com/svn/trunk/doc/index.html" target="_blank" style="color: #336699; text-decoration: none;">这里</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/google-sparsehash/" target="_blank" style="color: #336699; text-decoration: none;">Google Sparse Hash</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">非常节省内存的hash-map。<a href="http://google-sparsehash.googlecode.com/svn/trunk/doc/index.html" target="_blank" style="color: #336699; text-decoration: none;">指南见此</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/omaha/" target="_blank" style="color: #336699; text-decoration: none;">Omaha &#8211; Google Update</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Omaha，也就是Google Update，它可以保证你的软件随时升级到最新版本，目前很多Windows下的Google软件都是用Omaha升级的，包括Google Chrome和Google Earth，当然你也可以用于自己的应用程序。指南<a href="http://omaha.googlecode.com/svn/wiki/OmahaOverview.html" target="_blank" style="color: #336699; text-decoration: none;">看这里</a>&nbsp;还有<a href="http://code.google.com/p/omaha/wiki/DeveloperSetupGuide" target="_blank" style="color: #336699; text-decoration: none;">这里</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/protobuf/" target="_blank" style="color: #336699; text-decoration: none;">Protocol Buffers</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Protocol Buffers是一种可扩展编码序列数据的方式，Google在几乎所有内部RPC协议和文件格式都使用了Protocol Buffers。<a href="http://code.google.com/intl/pl/apis/protocolbuffers/docs/overview.html" target="_blank" style="color: #336699; text-decoration: none;">指南见此</a>&nbsp;。<a href="http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns" target="_blank" style="color: #336699; text-decoration: none;">它可以用于很多语言而且被一些IDE所支持，比如NetBeans</a>&nbsp;。&nbsp;</span></p><h4><a name="t1" style="color: rgb(51, 102, 153);"></a><span style="font-size: large;">互联网：</span></h4><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/google-code-prettify/" target="_blank" style="color: #336699; text-decoration: none;">Google Code Pretiffy</a>&nbsp;&nbsp;这 是一个Javascript模块和CSS文件，它可以让HTML页面里的部分源码高亮显示，支持C/C++, Java, Python, Ruby, PHP, VisualBasic, AWK, Bash, SQL, HTML, XML, CSS, JavaScript, Makefiles和部分Perl，不支持Smalltalk和所有的CAML。<a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html" target="_blank" style="color: #336699; text-decoration: none;">例子见此</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/spriteme/" target="_blank" style="color: #336699; text-decoration: none;">SpriteMe &#8211; easy &#8220;CSS spirtes&#8221;</a>&nbsp;&nbsp;SpriteMe使你可以更轻松的创造CSS Sprites（俗称雪碧&#8230;&#8230;）就是把网站要用到的图片都堆在一张图片里，用CSS控制调用哪个区域。<a href="http://spriteme.org/" target="_blank" style="color: #336699; text-decoration: none;">它有一个自己的官网在这里</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/reducisaurus/" target="_blank" style="color: #336699; text-decoration: none;">Redacisaurus</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Reducisaurus是一个压缩CSS和JS文件的网络服务，基于YUI压缩算法，运行于App Engine。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/jaikuengine/" target="_blank" style="color: #336699; text-decoration: none;">JaikuEngine</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">JaikuEngine是一个运行于App Engine的微博系统，由<a href="http://www.jaiku.com/" target="_blank" style="color: #336699; text-decoration: none;">jaiku.com</a>&nbsp;运营。要查看移动客户端的源码可以<a href="http://code.google.com/p/jaikuengine-mobile-client/" target="_blank" style="color: #336699; text-decoration: none;">看这里</a>&nbsp;，<a href="http://code.google.com/p/jaikuengine/source/browse/trunk/doc/README.txt" target="_blank" style="color: #336699; text-decoration: none;">这里还有介绍</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/selector-shell/" target="_blank" style="color: #336699; text-decoration: none;">Selector Shell</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Selector Shell是一个基于浏览器的测试工具，它可以让你看到CSS在不同浏览器里的样式，用Javascript写的，<a href="http://selector-shell.appspot.com/" target="_blank" style="color: #336699; text-decoration: none;">你可以在这里测试</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/google-feedserver/" target="_blank" style="color: #336699; text-decoration: none;">Google Feed Server</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Google Feed Server是一个开源Atom发布协议服务，基于Apache Abdera框架，允许开发者快速为当前数据源（比如数据库）配置feed。指南<a href="http://code.google.com/p/google-feedserver/wiki/SettingUpADevelopmentEnvironment" target="_blank" style="color: #336699; text-decoration: none;">见这里</a>&nbsp;和<a href="http://code.google.com/p/google-feedserver/wiki/DatabaseConfigurationForAFeed" target="_blank" style="color: #336699; text-decoration: none;">这里</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/soc/" target="_blank" style="color: #336699; text-decoration: none;">Melange, the Spice of Creation</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">这 个项目的目标是创建出一个适合开源贡献流程的框架，比如Google Summer of Code TM (GSoC)项目。使用这个框架你就可以用Google App Engine来运行Google Summer of Code项目，和其它类似项目比如Google Highly Open Participation TM Contest和GHOP。<a href="http://code.google.com/p/soc/wiki/GettingStarted" target="_blank" style="color: #336699; text-decoration: none;">指南见此</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/namebench/" target="_blank" style="color: #336699; text-decoration: none;">NameBench</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">它可以查找最快的DNS服务器给你的电脑用，在Mac OS X、Windows和UNIX系统下都有命令行也有用户界面可以帮你测试，这是Google工程师用20%自由时间写出来的。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/ratproxy/" target="_blank" style="color: #336699; text-decoration: none;">Rat Proxy</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">一个半自动化的大型被动网络应用安全审查工具，专为精确的探测而优化，<a href="http://code.google.com/p/ratproxy/wiki/RatproxyDoc" target="_blank" style="color: #336699; text-decoration: none;">文档在此</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/topdraw/" target="_blank" style="color: #336699; text-decoration: none;">TopDraw</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Top Draw是一个图形生成程序，使用简单的文字脚本，基于JavaScript编程语言，Top Draw可以创造出非常复杂和有趣的图形。支持Mac OS 10.5以上系统，使用XCode开发。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/etherpad/" style="color: #336699; text-decoration: none;">etherpad</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">开源的EtherPad，这是一个基于网络的实时合作文档编辑器，这个项目主要是为了演示代码而开发，帮助那些想在自己服务器部署Etherpad的人使用，<a href="http://code.google.com/p/etherpad/wiki/Instructions" target="_blank" style="color: #336699; text-decoration: none;">这里有如何安装的指南</a>。EtherPad使用JavaScript、Java和Comet服务器来建造实时协作服务。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/chromium/" target="_blank" style="color: #336699; text-decoration: none;">Chromium</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Chromium是开源版的Chrome浏览器，Chromium的目标是建立一个新一代的强大网络应用程序，它与Chrome有很多不同之处。<a href="http://code.google.com/p/chromium/wiki/LinuxBuildInstructions" target="_blank" style="color: #336699; text-decoration: none;">这里有指导如何在Linux上编译Chromium</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/v8/" target="_blank" style="color: #336699; text-decoration: none;">V8 Google&#8217;s open source JavaScript engine</a>&nbsp;&nbsp;V8 是Google的开源JavaScript引擎，用C++写成，用于Chrome浏览器之上。V8使用ECMAScript的ECMA-262第三版可运 行于Windows XP、Vista、Mac OS 10.5和使用IA-32或ARM处理器的Linux。V8可独立运行也可嵌入到任何C++程序里使用，<a href="http://code.google.com/intl/pl/apis/v8/build.html" target="_blank" style="color: #336699; text-decoration: none;">这里有指南</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://www.chromium.org/chromium-os" target="_blank" style="color: #336699; text-decoration: none;">Chromium OS</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Chromium OS是开源版的Chrome OS操作系统，提供快速、简单而安全的网络体验，<a href="http://git.chromium.org/" target="_blank" style="color: #336699; text-decoration: none;">源码在此</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://source.android.com/download" target="_blank" style="color: #336699; text-decoration: none;">Android</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Android是第一个免费、开源而且可完全自定义的移动平台，提供完整的堆栈：一个操作系统、中间件和重要的一用应用，它包含丰富的API可以让第三方开发者开发出强大的应用程序。&nbsp;</span></p><h4><a name="t2" style="color: rgb(51, 102, 153);"></a><span style="font-size: large;">MySQL工具：</span></h4><h4><a name="t3" style="color: rgb(51, 102, 153);"></a><span style="font-size: large;"><a href="http://code.google.com/p/google-mysql-tools/" target="_blank" style="color: #336699; text-decoration: none;">Google MySQL Tools</a>&nbsp;&nbsp;&nbsp;</span></h4><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">各种管理、维护和改进MySQL数据库性能的工具，由Google编写，包括：&nbsp;</span></p><ul style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><li><span style="font-size: large;">mypgrep.py：一个类似pgrep的工具来管理MySQL连接</span></li><li><span style="font-size: large;">compact_innodb.py：可导出和重载所有表格的密集型innodb数据文件</span></li></ul><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/google-mmaim/" target="_blank" style="color: #336699; text-decoration: none;">Google mMAIM</a>&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">mMAIM的目标是对MySQL的监控和分析更简单，且可以和任何环境整合使用。它可显示主/从同步状态，一些性能状态，可以返回大量&#8220;show&#8221;命令的状态等等。&nbsp;&nbsp;&nbsp;</span></p><h4><a name="t4" style="color: rgb(51, 102, 153);"></a><span style="font-size: large;">其它：</span></h4><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/stressapptest/" target="_blank" style="color: #336699; text-decoration: none;">Stressful Application Test (stressapptest)</a>&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Stressful Application Test试图让来自处理器和I/O到内存的数据尽量随机化，以创造出模拟现实的环境来测试现在的硬件设备是否稳定，Google就在使用它，现在是Apache 2.0许可，这里有<a href="http://code.google.com/p/stressapptest/wiki/Introduction" target="_blank" style="color: #336699; text-decoration: none;">介绍</a>&nbsp;、<a href="http://code.google.com/p/stressapptest/wiki/InstallationGuide" target="_blank" style="color: #336699; text-decoration: none;">安装向导</a>&nbsp;和<a href="http://code.google.com/p/stressapptest/wiki/UserGuide" target="_blank" style="color: #336699; text-decoration: none;">指南</a>&nbsp;。&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/pop-imap-troubleshooter/" target="_blank" style="color: #336699; text-decoration: none;">Pop and IMAP Troubleshooter</a>&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">它用于诊断并解决客户端到邮件服务器的连接问题。&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/openduckbill/" target="_blank" style="color: #336699; text-decoration: none;">OpenDuckBill</a>&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Openduckbill是一个Linux下简单的命令行备份工具，可用于监视文件/目录在有变化后是否标记为备份，并传输这些变化到本地备份目录、远程NFS导出分卷或是用rsync命令导出到远程SSH服务器。<a href="http://code.google.com/p/openduckbill/wiki/OpenduckbillReadme" target="_blank" style="color: #336699; text-decoration: none;">见安装向导</a>&nbsp;。&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/zxing/" target="_blank" style="color: #336699; text-decoration: none;">ZXing</a>&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">ZXing（发音类似Zebra crossing）是Java的开源多格式1D/2D条码图像处理库，目的是使用内置在手机上的摄像头拍照并对条码进行解码，而不必与服务器通讯，它被用于Android系统。这里有<a href="http://code.google.com/p/zxing/wiki/GettingStarted" target="_blank" style="color: #336699; text-decoration: none;">向导</a>&nbsp;和<a href="http://code.google.com/p/zxing/wiki/GetTheReader" target="_blank" style="color: #336699; text-decoration: none;">支持的设备列表</a>&nbsp;。&nbsp;<a href="http://code.google.com/p/tesseract-ocr/" target="_blank" style="color: #336699; text-decoration: none;">Tesseract OCR Engine</a>&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Tesseract OCR引擎是1995年UNLV Accuracy测试的前三名之一，在1995和2006年之间它的进展不大，但依然是当前精度最高的OCR引擎。这个源码可读取二进制、灰阶或彩色图片 并输出文字，内置一个TIFF阅读器可读取非压缩的TIFF文件，增加libtiff后也可读取压缩图片。<a href="http://code.google.com/p/tesseract-ocr/wiki/ReadMe" target="_blank" style="color: #336699; text-decoration: none;">指南</a>&nbsp;和<a href="http://code.google.com/p/tesseract-ocr/wiki/FAQ" target="_blank" style="color: #336699; text-decoration: none;">问答</a>&nbsp;。&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/neatx/" target="_blank" style="color: #336699; text-decoration: none;">Neatx &#8211; Open Source NX server</a>&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Neatx是一个开源NX服务，类似NoMachine公司商业的NX服务。NX协议比VNX更强大，它们的区别主要在：&nbsp;&nbsp;&nbsp;</span></p><ul style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><li><span style="font-size: large;">NX是X11客户端所以不会发送位图</span></li><li><span style="font-size: large;">NX可兼容X、VNC和Windows版的Remote Desktop</span></li><li><span style="font-size: large;">NX可缓存数据</span></li><li><span style="font-size: large;">NX<a href="http://notatnik.mekk.waw.pl/archives/159-Neatx_-_instrukcja_instalacji.html" target="_blank" style="color: #336699; text-decoration: none;">安装简单</a></span></li></ul><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">另外一个可选的项目可以看看Google的<a href="http://freenx.berlios.de/" target="_blank" style="color: #336699; text-decoration: none;">FreeNx</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/psvm/" target="_blank" style="color: #336699; text-decoration: none;">PSVM</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">它是<a href="http://books.nips.cc/papers/files/nips20/NIPS2007_0435.pdf" target="_blank" style="color: #336699; text-decoration: none;">这个文件</a>&nbsp;的代码，这是一个SVM的&#8220;支持所有核心&#8221;的版本，可多机并行运行，<a href="http://code.google.com/p/psvm/wiki/PSVMUsage" target="_blank" style="color: #336699; text-decoration: none;">实例见此</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://golang.org/" target="_blank" style="color: #336699; text-decoration: none;">GO</a>&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">Google开发的新编程语言，<a href="http://www.google.org.cn/posts/google-new-" target="_blank" style="color: #336699; text-decoration: none;">谷奥有报道</a>&nbsp;。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/google-collections/" target="_blank" style="color: #336699; text-decoration: none;">The Google Collections Library for Java</a>&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">这是一系列与Java 5以及更高版本有关的库，Google花钱给买过来了。&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;"><a href="http://code.google.com/p/google-styleguide/" target="_blank" style="color: #336699; text-decoration: none;">Google styleguide</a>&nbsp;&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-size: large;">每个主流的<a href="http://www.feng5166.com/blog/?tag=%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE" target="_blank" style="color: #336699; text-decoration: none;">开源项目</a>&nbsp;都有它自己的向导形式，比如一系列的演示代码。如果这些代码都按照&#8220;Style&#8221;的形式来演示，会更友好。<br /><br />本文转自：</span><a href="http://blog.csdn.net/hkx1n/article/details/6176573">http://blog.csdn.net/hkx1n/article/details/6176573</a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/206373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2014-03-28 09:43 <a href="http://www.cppblog.com/wanghaiguang/archive/2014/03/28/206373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>28个Unix/Linux的命令行神器</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/12/06/204631.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Fri, 06 Dec 2013 09:32:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/12/06/204631.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/204631.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/12/06/204631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/204631.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/204631.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: dstat & sar<br><br>iostat, vmstat, ifstat 三合一的工具，用来查看系统性能（我在《性能调优攻略》中提到过那三个xxstat工具）。<br><br>slurm<br><br>查看网络流量的一个工具&nbsp;&nbsp;<a href='http://www.cppblog.com/wanghaiguang/archive/2013/12/06/204631.html'>阅读全文</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/204631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-12-06 17:32 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/12/06/204631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用GDB调试程序（七）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204498.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 28 Nov 2013 04:48:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204498.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/204498.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/204498.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/204498.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt; font-family: Verdana;">改变程序的执行</strong><strong><br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; <span style="font-family: Verdana; font-size: 12pt;">一旦使用GDB挂上被调试程序，当程序运行起来后，你可以根据自己的调试思路来动态地在GDB中更改当前被调试程序的运行线路或是其变量的值，这个强大的功能能够让你更好的调试你的程序，比如，你可以在程序的一次运行中走遍程序的所有分支。&nbsp;&nbsp;</span><strong><br /></strong><strong style="font-family: Verdana; font-size: 12pt;">一、修改变量值</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 修改被调试程序运行时的变量值，在GDB中很容易实现，使用GDB的print命令即可完成。如：</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) print x=4&nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; x=4这个表达式是C/C++的语法，意为把变量x的值修改为4，如果你当前调试的语言是Pascal，那么你可以使用Pascal的语法：x:=4。&nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 在某些时候，很有可能你的变量和GDB中的参数冲突，如：&nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) whatis width</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type = double</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p width</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $4 = 13</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) set width=47</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Invalid syntax in expression.</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 因为，set width是GDB的命令，所以，出现了&#8220;Invalid syntax in expression&#8221;的设置错误，此时，你可以使用set var命令来告诉GDB，width不是你GDB的参数，而是程序的变量名，如：&nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) set var width=47&nbsp; &nbsp; &nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 另外，还可能有些情况，GDB并不报告这种错误，所以保险起见，在你改变程序变量取值时，最好都使用set var格式的GDB命令。&nbsp; &nbsp;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">二、跳转执行</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 一般来说，被调试程序会按照程序代码的运行顺序依次执行。GDB提供了乱序执行的功能，也就是说，GDB可以修改程序的执行顺序，可以让程序执行随意跳跃。这个功能可以由GDB的jump命令来完：&nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; jump &lt;linespec&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 指定下一条语句的运行点。&lt;linespce&gt;可以是文件的行号，可以是file:line格式，可以是+num这种偏移量格式。表式着下一条运行语句从哪里开始。&nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; jump &lt;address&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 这里的&lt;address&gt;是代码行的内存地址。&nbsp; &nbsp;&nbsp;</span><br />&nbsp;&nbsp;&nbsp; <span style="color: red; font-family: Verdana; font-size: 12pt;">注意</span><span style="font-family: Verdana; font-size: 12pt;">，jump命令不会改变当前的程序栈中的内容，所以，当你从一个函数跳到另一个函数时，当函数运行完返回时进行弹栈操作时必然会发生错误，可能结果还是非常奇怪的，甚至于产生程序Core Dump。所以最好是同一个函数中进行跳转。&nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 熟悉汇编的人都知道，程序运行时，有一个寄存器用于保存当前代码所在的内存地址。所以，jump命令也就是改变了这个寄存器中的值。于是，你可以使用&#8220;set $pc&#8221;来更改跳转执行的地址。如：&nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set $pc = 0x485</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">三、产生信号量</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 使用singal命令，可以产生一个信号量给被调试的程序。如：中断信号Ctrl+C。这非常方便于程序的调试，可以在程序运行的任意位置设置断点，并在该断点用GDB产生一个信号量，这种精确地在某处产生信号非常有利程序的调试。&nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 语法是：signal &lt;singal&gt;，UNIX的系统信号量通常从1到15。所以&lt;singal&gt;取值也在这个范围。&nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; single命令和shell的kill命令不同，系统的kill命令发信号给被调试程序时，是由GDB截获的，而single命令所发出一信号则是直接发给被调试程序的。&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">四、强制函数返回</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 如果你的调试断点在某个函数中，并还有语句没有执行完。你可以使用return命令强制函数忽略还没有执行的语句并返回。&nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; return</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; return &lt;expression&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 使用return命令取消当前函数的执行，并立即返回，如果指定了&lt;expression&gt;，那么该表达式的值会被认作函数的返回值。&nbsp; &nbsp;&nbsp;</span><br /><strong style="font-family: Verdana; font-size: 12pt;">五、强制调用函数</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; call &lt;expr&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 表达式中可以一是函数，以此达到强制调用函数的目的。并显示函数的返回值，如果函数返回值是void，那么就不显示。&nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 另一个相似的命令也可以完成这一功能&#8212;&#8212;print，print后面可以跟表达式，所以也可以用他来调用函数，print和call的不同是，如果函数返回void，call则不显示，print则显示函数返回值，并把该值存入历史数据中。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">在不同语言中使用GDB<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">GDB支持下列语言：C, C++, Fortran, PASCAL, Java, Chill, assembly, 和 Modula-2。一般说来，GDB会根据你所调试的程序来确定当然的调试语言，比如：发现文件名后缀为&#8220;.c&#8221;的，GDB会认为是C程序。文件名后缀为&#8220;.C, .cc, .cp, .cpp, .cxx, .c++&#8221;的，GDB会认为是C++程序。而后缀是&#8220;.f, .F&#8221;的，GDB会认为是Fortran程序，还有，后缀为如果是&#8220;.s, .S&#8221;的会认为是汇编语言。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">也就是说，GDB会根据你所调试的程序的语言，来设置自己的语言环境，并让GDB的命令跟着语言环境的改变而改变。比如一些GDB命令需要用到表达式或变量时，这些表达式或变量的语法，完全是根据当前的语言环境而改变的。例如C/C++中对指针的语法是*p，而在Modula-2中则是p^。并且，如果你当前的程序是由几种不同语言一同编译成的，那到在调试过程中，GDB也能根据不同的语言自动地切换语言环境。这种跟着语言环境而改变的功能，真是体贴开发人员的一种设计。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">下面是几个相关于GDB语言环境的命令：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; show language&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看当前的语言环境。如果GDB不能识为你所调试的编程语言，那么，C语言被认为是默认的环境。&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; info frame</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看当前函数的程序语言。&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; info source</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看当前文件的程序语言。&nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">如果GDB没有检测出当前的程序语言，那么你也可以手动设置当前的程序语言。使用set language命令即可做到。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 当set language命令后什么也不跟的话，你可以查看GDB所支持的语言种类：&nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) set language</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The currently understood settings are:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local or auto&nbsp;&nbsp;&nbsp; Automatic setting based on source file</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use the C language</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c++&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use the C++ language</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use the Asm language</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use the Chill language</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fortran&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use the Fortran language</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use the Java language</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; modula-2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use the Modula-2 language</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pascal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use the Pascal language</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scheme&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use the Scheme language</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 于是你可以在set language后跟上被列出来的程序语言名，来设置当前的语言环境。&nbsp;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">后记<br />&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于，其可以形成执行序列，形成脚本。UNIX下的软件全是命令行的，这给程序开发提代供了极大的便利，命令行软件的优势在于，它们可以非常容易的集成在一起，使用几个简单的已有工具的命令，就可以做出一个非常强大的功能。&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 于是UNIX下的软件比Windows下的软件更能有机地结合，各自发挥各自的长处，组合成更为强劲的功能。而Windows下的图形软件基本上是各自为营，互相不能调用，很不利于各种软件的相互集成。在这里并不是要和Windows做个什么比较，所谓&#8220;寸有所长，尺有所短&#8221;，图形化工具还是有不如命令行的地方。（看到这句话时，希望各位千万再也不要认为我就是&#8220;鄙视图形界面&#8221;，和我抬杠了 ）&nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 我是根据版本为5.1.1的GDB所写的这篇文章，所以可能有些功能已被修改，或是又有更为强劲的功能。而且，我写得非常仓促，写得比较简略，并且，其中我已经看到有许多错别字了（我用五笔，所以错字让你看不懂），所以，我在这里对我文中的差错表示万分的歉意。&nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 文中所罗列的GDB的功能时，我只是罗列了一些带用的GDB的命令和使用方法，其实，我这里只讲述的功能大约只占GDB所有功能的60%吧，详细的文档，还是请查看GDB的帮助和使用手册吧，或许，过段时间，如果我有空，我再写一篇GDB的高级使用。&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 我个人非常喜欢GDB的自动调试的功能，这个功能真的很强大，试想，我在UNIX下写个脚本，让脚本自动编译我的程序，被自动调试，并把结果报告出来，调试成功，自动checkin源码库。一个命令，编译带着调试带着checkin，多爽啊。只是GDB对自动化调试目前支持还不是很成熟，只能实现半自动化，真心期望着GDB的自动化调试功能的成熟。&nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 如果各位对GDB或是别的技术问题有兴趣的话，欢迎和我讨论交流。本人目前主要在UNIX下做产品软件的开发，所以，对UNIX下的软件开发比较熟悉，当然，不单单是技术，对软件工程实施，软件设计，系统分析，项目管理我也略有心得。欢迎大家找我交流，（QQ是：753640，MSN是：haoel@hotmail.com）</span><br /><br /><span style="font-family: Verdana; font-size: 12pt;">本文转自：</span><a href="http://blog.csdn.net/haoel/article/details/2885" style="font-family: verdana, 'courier new'; line-height: 21px;"><span style="font-family: Verdana; font-size: 12pt;">http://blog.csdn.net/haoel/article/details/2885</span></a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/204498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-11-28 12:48 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 用GDB调试程序（六）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204497.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 28 Nov 2013 04:18:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204497.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/204497.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/204497.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/204497.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">七、设置显示选项</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; GDB中关于显示的选项比较多，这里我只例举大多数常用的选项。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print address&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print address on&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开地址输出，当程序显示函数信息时，GDB会显出函数的参数地址。系统默认为打开的，如：&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) f</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #0&nbsp; set_quotes (lq=0x34c78 "&lt;&lt;", rq=0x34c88 "&gt;&gt;")</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at input.c:530</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 530&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (lquote != def_lquote)</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print address off&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭函数的参数地址显示，如：&nbsp; &nbsp; &nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) set print addr off</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) f</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #0&nbsp; set_quotes (lq="&lt;&lt;", rq="&gt;&gt;") at input.c:530</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 530&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (lquote != def_lquote)</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; show print address&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看当前地址显示选项是否打开。&nbsp; &nbsp; &nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print array&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print array on&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开数组显示，打开后当数组显示时，每个元素占一行，如果不打开的话，每个元素则以逗号分隔。这个选项默认是关闭的。与之相关的两个命令如下，我就不再多说了。&nbsp; &nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print array off&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; show print array</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print elements &lt;number-of-elements&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个选项主要是设置数组的，如果你的数组太大了，那么就可以指定一个&lt;number-of-elements&gt;来指定数据显示的最大长度，当到达这个长度时，GDB就不再往下显示了。如果设置为0，则表示不限制。&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; show print elements&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看print elements的选项信息。&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print null-stop &lt;on/off&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果打开了这个选项，那么当显示字符串时，遇到结束符则停止显示。这个选项默认为off。&nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print pretty on&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果打开printf pretty这个选项，那么当GDB显示结构体时会比较漂亮。如：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $1 = {</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next = 0x0,</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flags = {</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sweet = 1,</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sour = 1</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; meat = 0x54 "Pork"</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print pretty off</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭printf pretty这个选项，GDB显示结构体时会如下显示：&nbsp; &nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $1 = {next = 0x0, flags = {sweet = 1, sour = 1}, meat = 0x54 "Pork"}&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; show print pretty&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看GDB是如何显示结构体的。&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print sevenbit-strings &lt;on/off&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置字符显示，是否按&#8220;/nnn&#8221;的格式显示，如果打开，则字符串或字符数据按/nnn显示，如&#8220;/065&#8221;。&nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; show print sevenbit-strings</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看字符显示开关是否打开。&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print union &lt;on/off&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置显示结构体时，是否显式其内的联合体数据。例如有以下数据结构：&nbsp; &nbsp; &nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef enum {Tree, Bug} Species;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef enum {Big_tree, Acorn, Seedling} Tree_forms;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef enum {Caterpillar, Cocoon, Butterfly}</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bug_forms;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct thing {</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Species it;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union {</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tree_forms tree;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bug_forms bug;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } form;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct thing foo = {Tree, {Acorn}};</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当打开这个开关时，执行 p foo 命令后，会如下显示：</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $1 = {it = Tree, form = {tree = Acorn, bug = Cocoon}}</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当关闭这个开关时，执行 p foo 命令后，会如下显示：</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $1 = {it = Tree, form = {...}}</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; show print union</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看联合体数据的显示方式&nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print object &lt;on/off&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在C++中，如果一个对象指针指向其派生类，如果打开这个选项，GDB会自动按照虚方法调用的规则显示输出，如果关闭这个选项的话，GDB就不管虚函数表了。这个选项默认是off。</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; show print object</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看对象选项的设置。&nbsp; &nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print static-members &lt;on/off&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个选项表示，当显示一个C++对象中的内容是，是否显示其中的静态数据成员。默认是on。&nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; show print static-members</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看静态数据成员选项设置。&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set print vtbl &lt;on/off&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当此选项打开时，GDB将用比较规整的格式来显示虚函数表时。其默认是关闭的。&nbsp; &nbsp; &nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; show print vtbl</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看虚函数显示格式的选项。</span><strong>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br /></strong><strong style="font-family: Verdana; font-size: 12pt;">八、历史记录</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 当你用GDB的print查看程序运行时的数据时，你每一个print都会被GDB记录下来。GDB会以$1, $2, $3 .....这样的方式为你每一个print命令编上号。于是，你可以使用这个编号访问以前的表达式，如$1。这个功能所带来的好处是，如果你先前输入了一个比较长的表达式，如果你还想查看这个表达式的值，你可以使用历史记录来访问，省去了重复输入。</span><br /><strong style="font-family: Verdana; font-size: 12pt;">九、GDB环境变量</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 你可以在GDB的调试环境中定义自己的变量，用来保存一些调试程序中的运行数据。要定义一个GDB的变量很简单只需。使用GDB的set命令。GDB的环境变量和UNIX一样，也是以$起头。如：&nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set $foo = *object_ptr&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 使用环境变量时，GDB会在你第一次使用时创建这个变量，而在以后的使用中，则直接对其賦值。环境变量没有类型，你可以给环境变量定义任一的类型。包括结构体和数组。&nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; show convenience&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该命令查看当前所设置的所有的环境变量。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 这是一个比较强大的功能，环境变量和程序变量的交互使用，将使得程序调试更为灵活便捷。例如：&nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set $i = 0</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print bar[$i++]-&gt;contents&nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 于是，当你就不必，print bar[0]-&gt;contents, print bar[1]-&gt;contents地输入命令了。输入这样的命令后，只用敲回车，重复执行上一条语句，环境变量会自动累加，从而完成逐个输出的功能。&nbsp; &nbsp;&nbsp;&nbsp;</span><br /><strong style="font-family: Verdana; font-size: 12pt;">十、查看寄存器</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 要查看寄存器的值，很简单，可以使用如下命令：&nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; info registers&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看寄存器的情况。（除了浮点寄存器）&nbsp; &nbsp;&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; info all-registers</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看所有寄存器的情况。（包括浮点寄存器）&nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; info registers &lt;regname ...&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看所指定的寄存器的情况。&nbsp; &nbsp; &nbsp; &nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 寄存器中放置了程序运行时的数据，比如程序当前运行的指令地址（ip），程序的当前堆栈地址（sp）等等。你同样可以使用print命令来访问寄存器的情况，只需要在寄存器名字前加一个$符号就可以了。如：p $eip。</span><br /><br /><span style="font-family: Verdana; font-size: 12pt;">本文转自：</span><a href="http://blog.csdn.net/haoel/article/details/2884" style="font-family: verdana, 'courier new'; line-height: 21px;"><span style="font-family: Verdana; font-size: 12pt;">http://blog.csdn.net/haoel/article/details/2884</span></a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/204497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-11-28 12:18 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用GDB调试程序（五）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204496.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 28 Nov 2013 04:14:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204496.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/204496.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/204496.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/204496.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">查看运行时数据<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</strong>&nbsp; &nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; 在你调试程序时，当程序被停住时，你可以使用print命令（简写命令为p），或是同义命令inspect来查看当前程序的运行数据。print命令的格式是：&nbsp;<br />&nbsp;&nbsp;&nbsp; print &lt;expr&gt;<br />&nbsp;&nbsp;&nbsp; print /&lt;f&gt; &lt;expr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;expr&gt;是表达式，是你所调试的程序的语言的表达式（GDB可以调试多种编程语言），&lt;f&gt;是输出的格式，比如，如果要把表达式按16进制的格式输出，那么就是/x。&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;<br /><strong>一、表达式</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; print和许多GDB的命令一样，可以接受一个表达式，GDB会根据当前的程序运行的数据来计算这个表达式，既然是表达式，那么就可以是当前程序运行中的const常量、变量、函数等内容。可惜的是GDB不能使用你在程序中所定义的宏。&nbsp; &nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 表达式的语法应该是当前所调试的语言的语法，由于C/C++是一种大众型的语言，所以，本文中的例子都是关于C/C++的。（而关于用GDB调试其它语言的章节，我将在后面介绍）&nbsp; &nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 在表达式中，有几种GDB所支持的操作符，它们可以用在任何一种语言中。&nbsp; &nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; @</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是一个和数组有关的操作符，在后面会有更详细的说明。&nbsp; &nbsp; &nbsp; &nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; ::</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定一个在文件或是一个函数中的变量。&nbsp; &nbsp; &nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; {&lt;type&gt;} &lt;addr&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示一个指向内存地址&lt;addr&gt;的类型为type的一个对象。</span>&nbsp;<br /><strong style="font-size: 12pt;">二、程序变量</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 在GDB中，你可以随时查看以下三种变量的值：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、全局变量（所有文件可见的）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、静态全局变量（当前文件可见的）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、局部变量（当前Scope可见的）</span>&nbsp; &nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 如果你的局部变量和全局变量发生冲突（也就是重名），一般情况下是局部变量会隐藏全局变量，也就是说，如果一个全局变量和一个函数中的局部变量同名时，如果当前停止点在函数中，用print显示出的变量的值会是函数中的局部变量的值。如果此时你想查看全局变量的值时，你可以使用&#8220;::&#8221;操作符：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file::variable</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; function::variable</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 可以通过这种形式指定你所想查看的变量，是哪个文件中的或是哪个函数中的。例如，查看文件f2.c中的全局变量x的值：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; gdb) p 'f2.c'::x</span>&nbsp; &nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 当然，&#8220;::&#8221;操作符会和C++中的发生冲突，GDB能自动识别&#8220;::&#8221; 是否C++的操作符，所以你不必担心在调试C++程序时会出现异常。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 另外，需要注意的是，如果你的程序编译时开启了优化选项，那么在用GDB调试被优化过的程序时，可能会发生某些变量不能访问，或是取值错误码的情况。这个是很正常的，因为优化程序会删改你的程序，整理你程序的语句顺序，剔除一些无意义的变量等，所以在GDB调试这种程序时，运行时的指令和你所编写指令就有不一样，也就会出现你所想象不到的结果。对付这种情况时，需要在编译程序时关闭编译优化。一般来说，几乎所有的编译器都支持编译优化的开关，例如，GNU的C/C++编译器GCC，你可以使用&#8220;-gstabs&#8221;选项来解决这个问题。关于编译器的参数，还请查看编译器的使用说明文档。&nbsp;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">三、数组</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 有时候，你需要查看一段连续的内存空间的值。比如数组的一段，或是动态分配的数据的大小。你可以使用GDB的&#8220;@&#8221;操作符，&#8220;@&#8221;的左边是第一个内存的地址的值，&#8220;@&#8221;的右边则你你想查看内存的长度。例如，你的程序中有这样的语句：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *array = (int *) malloc (len * sizeof (int));&nbsp; &nbsp;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 于是，在GDB调试过程中，你可以以如下命令显示出这个动态数组的取值：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p&nbsp;*array@len</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; @的左边是数组的首地址的值，也就是变量array所指向的内容，右边则是数据的长度，其保存在变量len中，其输出结果，大约是下面这个样子的：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p&nbsp;*array@len</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 如果是静态数组的话，可以直接用print数组名，就可以显示数组中所有数据的内容了。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">四、输出格式</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 一般来说，GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如，你想输出一个整数的十六进制，或是二进制来查看这个整型变量的中的位的情况。要做到这样，你可以使用GDB的数据显示格式：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; x&nbsp; 按十六进制格式显示变量。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; d&nbsp; 按十进制格式显示变量。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; u&nbsp; 按十六进制格式显示无符号整型。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; o&nbsp; 按八进制格式显示变量。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; t&nbsp; 按二进制格式显示变量。&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; a&nbsp; 按十六进制格式显示变量。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; c&nbsp; 按字符格式显示变量。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; f&nbsp; 按浮点数格式显示变量。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p i</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $21 = 101&nbsp;&nbsp;&nbsp;&nbsp;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p/a i</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $22 = 0x65</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p/c i</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $23 = 101 'e'</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p/f i</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $24 = 1.41531145e-43</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p/x i</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $25 = 0x65</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p/t i</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $26 = 1100101</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">五、查看内存</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 你可以使用examine命令（简写是x）来查看内存地址中的值。x命令的语法如下所示：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; x/&lt;n/f/u&gt; &lt;addr&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; n、f、u是可选的参数。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; n 是一个正整数，表示显示内存的长度，也就是说从当前地址向后显示几个地址的内容。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; f 表示显示的格式，参见上面。如果地址所指的是字符串，那么格式可以是s，如果地十是指令地址，那么格式可以是i。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; u 表示从当前地址往后请求的字节数，如果不指定的话，GDB默认是4个bytes。u参数可以用下面的字符来代替，b表示单字节，h表示双字节，w表示四字节，g表示八字节。当我们指定了字节长度后，GDB会从指内存定的内存地址开始，读写指定字节，并把其当作一个值取出来。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; &lt;addr&gt;表示一个内存地址。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; n/f/u三个参数可以一起使用。例如：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 命令：x/3uh 0x54320 表示，从内存地址0x54320读取内容，h表示以双字节为一个单位，3表示三个单位，u表示按十六进制显示。&nbsp;</span><br /><strong style="font-size: 12pt;">六、自动显示</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 你可以设置一些自动显示的变量，当程序停住时，或是在你单步跟踪时，这些变量会自动显示。相关的GDB命令是display。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; display &lt;expr&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; display/&lt;fmt&gt; &lt;expr&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; display/&lt;fmt&gt; &lt;addr&gt;&nbsp;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; expr是一个表达式，fmt表示显示的格式，addr表示内存地址，当你用display设定好了一个或多个表达式后，只要你的程序被停下来，GDB会自动显示你所设置的这些表达式的值。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 格式i和s同样被display支持，一个非常有用的命令是：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display/i $pc</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; $pc是GDB的环境变量，表示着指令的地址，/i则表示输出格式为机器指令码，也就是汇编。于是当程序停下后，就会出现源代码和机器指令码相对应的情形，这是一个很有意思的功能。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 下面是一些和display相关的GDB命令：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; undisplay &lt;dnums...&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; delete display &lt;dnums...&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 删除自动显示，dnums意为所设置好了的自动显式的编号。如果要同时删除几个，编号可以用空格分隔，如果要删除一个范围内的编号，可以用减号表示（如：2-5）</span><br />&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; disable display &lt;dnums...&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; enable display &lt;dnums...&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; disable和enalbe不删除自动显示的设置，而只是让其失效和恢复。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; info display</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 查看display设置的自动显示的信息。GDB会打出一张表格，向你报告当然调试中设置了多少个自动显示设置，其中包括，设置的编号，表达式，是否enable。</span><br /><br /><span style="font-size: 12pt;">本文转自：</span><a href="http://blog.csdn.net/haoel/article/details/2883" style="font-family: verdana, 'courier new'; line-height: 21px;"><span style="font-size: 12pt;">http://blog.csdn.net/haoel/article/details/2883</span></a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/204496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-11-28 12:14 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用GDB调试程序（四）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204495.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 28 Nov 2013 04:12:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204495.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/204495.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/204495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/204495.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">查看栈信息<br />&#8212;&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">当程序被停住了，你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数，函数的地址，函数参数，函数内的局部变量都会被压入&#8220;栈&#8221;（Stack）中。你可以用GDB命令来查看当前的栈中的信息。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">下面是一些查看函数调用栈信息的GDB命令：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; backtrace&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; bt&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打印当前的函数调用栈的所有信息。如：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) bt</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #0&nbsp; func (n=250) at tst.c:6</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #1&nbsp; 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #2&nbsp; 0x400409ed in __libc_start_main () from /lib/libc.so.6</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从上可以看出函数的调用栈信息：__libc_start_main --&gt; main() --&gt; func()&nbsp; &nbsp;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; backtrace &lt;n&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; bt &lt;n&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n是一个正整数，表示只打印栈顶上n层的栈信息。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; backtrace &lt;-n&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; bt &lt;-n&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -n表一个负整数，表示只打印栈底下n层的栈信息。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">如果你要查看某一层的信息，你需要在切换当前的栈，一般来说，程序停止时，最顶层的栈就是当前栈，如果你要查看栈下面层的详细信息，首先要做的是切换当前栈。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; frame &lt;n&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; f &lt;n&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n是一个从0开始的整数，是栈中的层编号。比如：frame 0，表示栈顶，frame 1，表示栈的第二层。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; up &lt;n&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示向栈的上面移动n层，可以不打n，表示向上移动一层。&nbsp;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; down &lt;n&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示向栈的下面移动n层，可以不打n，表示向下移动一层。&nbsp;&nbsp; &nbsp;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 上面的命令，都会打印出移动到的栈层的信息。如果你不想让其打出信息。你可以使用这三个命令：</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select-frame &lt;n&gt; 对应于 frame 命令。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; up-silently &lt;n&gt; 对应于 up 命令。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; down-silently &lt;n&gt; 对应于 down 命令。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">查看当前栈层的信息，你可以用以下GDB命令：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; frame 或 f&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会打印出这些信息：栈的层编号，当前的函数名，函数参数值，函数所在文件及行号，函数执行到的语句。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; info frame&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; info f&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个命令会打印出更为详细的当前栈层的信息，只不过，大多数都是运行时的内内地址。比如：函数地址，调用函数的地址，被调用函数的地址，目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。如：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) info f</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stack level 0, frame at 0xbffff5d4:</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eip = 0x804845d in func (tst.c:6); saved eip 0x8048524</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; called by frame at 0xbffff60c</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; source language c.</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Arglist at 0xbffff5d4, args: n=250</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Locals at 0xbffff5d4, Previous frame's sp is 0x0</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Saved registers:</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp at 0xbffff5d4, eip at 0xbffff5d8</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp; info args</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打印出当前函数的参数名及其值。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp; info locals</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打印出当前函数中所有局部变量及其值。&nbsp; &nbsp;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp; info catch</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打印出当前的函数中的异常处理信息。&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;</span><br /><strong style="font-size: 12pt;">查看源程序<br />&#8212;&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">一、显示源代码</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; GDB 可以打印出所调试程序的源代码，当然，在程序编译时一定要加上-g的参数，把源程序信息编译到执行文件中。不然就看不到源程序了。当程序停下来以后，GDB会报告程序停在了那个文件的第几行上。你可以用list命令来打印程序的源代码。还是来看一看查看源代码的GDB命令吧。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; list &lt;linenum&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示程序第linenum行的周围的源程序。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; list &lt;function&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示函数名为function的函数的源程序。&nbsp;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; list&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示当前行后面的源程序。&nbsp; &nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; list -&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示当前行前面的源程序。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">一般是打印当前行的上5行和下5行，如果显示函数是是上2行下8行，默认是10行，当然，你也可以定制显示的范围，使用下面命令可以设置一次显示源程序的行数。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; set listsize &lt;count&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置一次显示源代码的行数。&nbsp; &nbsp; &nbsp;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; show listsize</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看当前listsize的设置。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">list命令还有下面的用法：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; list &lt;first&gt;, &lt;last&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示从first行到last行之间的源代码。&nbsp; &nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; list , &lt;last&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示从当前行到last行之间的源代码。&nbsp; &nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; list +</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 往后显示源代码。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">一般来说在list后面可以跟以下这们的参数：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; &lt;linenum&gt;&nbsp;&nbsp; 行号。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; &lt;+offset&gt;&nbsp;&nbsp; 当前行号的正偏移量。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; &lt;-offset&gt;&nbsp;&nbsp; 当前行号的负偏移量。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; &lt;filename:linenum&gt;&nbsp; 哪个文件的哪一行。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; &lt;function&gt;&nbsp; 函数名。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; &lt;filename:function&gt; 哪个文件中的哪个函数。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; &lt;*address&gt;&nbsp; 程序运行时的语句在内存中的地址。&nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">二、搜索源代码</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">不仅如此，GDB还提供了源代码搜索的命令：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; forward-search &lt;regexp&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; search &lt;regexp&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 向前面搜索。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; reverse-search &lt;regexp&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 全部搜索。&nbsp; &nbsp; &nbsp;</span><br /><span style="font-size: 12pt;">其中，&lt;regexp&gt;就是正则表达式，也主一个字符串的匹配模式，关于正则表达式，我就不在这里讲了，还请各位查看相关资料。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">三、指定源文件的路径</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">某些时候，用-g编译过后的执行程序中只是包括了源文件的名字，没有路径名。GDB提供了可以让你指定源文件的路径的命令，以便GDB进行搜索。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; directory &lt;dirname ... &gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; dir &lt;dirname ... &gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加一个源文件路径到当前路径的前面。如果你要指定多个路径，UNIX下你可以使用&#8220;:&#8221;，Windows下你可以使用&#8220;;&#8221;。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; directory&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清除所有的自定义的源文件搜索路径信息。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; show directories&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示定义了的源文件搜索路径。&nbsp; &nbsp;&nbsp;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">四、源代码的内存</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">你可以使用info line命令来查看源代码在内存中的地址。info line后面可以跟&#8220;行号&#8221;，&#8220;函数名&#8221;，&#8220;文件名:行号&#8221;，&#8220;文件名:函数名&#8221;，这个命令会打印出所指定的源码在运行时的内存地址，如：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) info line tst.c:func</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Line 5 of "tst.c" starts at address 0x8048456 &lt;func+6&gt; and ends at 0x804845d &lt;func+13&gt;.</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">还有一个命令（disassemble）你可以查看源程序的当前执行时的机器码，这个命令会把目前内存中的指令dump出来。如下面的示例表示查看函数func的汇编代码。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) disassemble func</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dump of assembler code for function func:</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048450 &lt;func&gt;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; %ebp</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048451 &lt;func+1&gt;:&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %esp,%ebp</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048453 &lt;func+3&gt;:&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp;&nbsp; $0x18,%esp</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048456 &lt;func+6&gt;:&nbsp;&nbsp;&nbsp;&nbsp; movl&nbsp;&nbsp; $0x0,0xfffffffc(%ebp)</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x804845d &lt;func+13&gt;:&nbsp;&nbsp;&nbsp; movl&nbsp;&nbsp; $0x1,0xfffffff8(%ebp)</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048464 &lt;func+20&gt;:&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; 0xfffffff8(%ebp),%eax</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048467 &lt;func+23&gt;:&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp; 0x8(%ebp),%eax</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x804846a &lt;func+26&gt;:&nbsp;&nbsp;&nbsp; jle&nbsp;&nbsp;&nbsp; 0x8048470 &lt;func+32&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x804846c &lt;func+28&gt;:&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp; 0x8048480 &lt;func+48&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x804846e &lt;func+30&gt;:&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %esi,%esi</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048470 &lt;func+32&gt;:&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; 0xfffffff8(%ebp),%eax</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048473 &lt;func+35&gt;:&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; %eax,0xfffffffc(%ebp)</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048476 &lt;func+38&gt;:&nbsp;&nbsp;&nbsp; incl&nbsp;&nbsp; 0xfffffff8(%ebp)</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048479 &lt;func+41&gt;:&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp; 0x8048464 &lt;func+20&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x804847b &lt;func+43&gt;:&nbsp;&nbsp;&nbsp; nop</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x804847c &lt;func+44&gt;:&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp; 0x0(%esi,1),%esi</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048480 &lt;func+48&gt;:&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; 0xfffffffc(%ebp),%edx</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048483 &lt;func+51&gt;:&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %edx,%eax</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048485 &lt;func+53&gt;:&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp; 0x8048487 &lt;func+55&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048487 &lt;func+55&gt;:&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %ebp,%esp</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8048489 &lt;func+57&gt;:&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; %ebp</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x804848a &lt;func+58&gt;:&nbsp;&nbsp;&nbsp; ret</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End of assembler dump.</span><br /><br /><span style="font-size: 12pt;">本文转自：</span><a href="http://blog.csdn.net/haoel/article/details/2882" style="font-family: verdana, 'courier new'; line-height: 21px;"><span style="font-size: 12pt;">http://blog.csdn.net/haoel/article/details/2882</span></a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/204495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-11-28 12:12 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用GDB调试程序（三）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204494.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 28 Nov 2013 04:08:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204494.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/204494.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/204494.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/204494.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">四、维护停止点</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">上面说了如何设置程序的停止点，GDB中的停止点也就是上述的三类。在GDB中，如果你觉得已定义好的停止点没有用了，你可以使用delete、clear、disable、enable这几个命令来进行维护。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; clear</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清除所有的已定义的停止点。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; clear &lt;function&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; clear &lt;filename:function&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清除所有设置在函数上的停止点。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; clear &lt;linenum&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; clear &lt;filename:linenum&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清除所有设置在指定行上的停止点。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; delete [breakpoints] [range...]</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 删除指定的断点，breakpoints为断点号。如果不指定断点号，则表示删除所有的断点。range 表示断点号的范围（如：3-7）。其简写命令为d。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><br /><span style="font-family: Verdana; font-size: 12pt;">比删除更好的一种方法是disable停止点，disable了的停止点，GDB不会删除，当你还需要时，enable即可，就好像回收站一样。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; disable [breakpoints] [range...]</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disable所指定的停止点，breakpoints为停止点号。如果什么都不指定，表示disable所有的停止点。简写命令是dis.</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; enable [breakpoints] [range...]</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable所指定的停止点，breakpoints为停止点号。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; enable [breakpoints] once range...</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable所指定的停止点一次，当程序停止后，该停止点马上被GDB自动disable。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; enable [breakpoints] delete range...</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable所指定的停止点一次，当程序停止后，该停止点马上被GDB自动删除。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">五、停止条件维护</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">前面在说到设置断点时，我们提到过可以设置一个条件，当条件成立时，程序自动停止，这是一个非常强大的功能，这里，我想专门说说这个条件的相关维护命令。一般来说，为断点设置一个条件，我们使用if关键词，后面跟其断点条件。并且，条件设置好后，我们可以用condition命令来修改断点的条件。（只有break和watch命令支持if，catch目前暂不支持if）</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; condition &lt;bnum&gt; &lt;expression&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改断点号为bnum的停止条件为expression。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; condition &lt;bnum&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清除断点号为bnum的停止条件。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><br /><span style="font-family: Verdana; font-size: 12pt;">还有一个比较特殊的维护命令ignore，你可以指定程序运行时，忽略停止条件几次。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; ignore &lt;bnum&gt; &lt;count&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示忽略断点号为bnum的停止条件count次。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">六、为停止点设定运行命令</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">我们可以使用GDB提供的command命令来设置停止点的运行命令。也就是说，当运行的程序在被停止住时，我们可以让其自动运行一些别的命令，这很有利行自动化调试。对基于GDB的自动化调试是一个强大的支持。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; commands [bnum]</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; ... command-list ...</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; end</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 为断点号bnum指写一个命令列表。当程序被该断点停住时，gdb会依次运行命令列表中的命令。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 例如：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break foo if x&gt;0</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commands</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf "x is %d/n",x</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断点设置在函数foo中，断点条件是x&gt;0，如果程序被断住后，也就是，一旦x的值在foo函数中大于0，GDB会自动打印出x的值，并继续运行程序。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">如果你要清除断点上的命令序列，那么只要简单的执行一下commands命令，并直接在打个end就行了。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">七、断点菜单</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">在C++中，可能会重复出现同一个名字的函数若干次（函数重载），在这种情况下，break &lt;function&gt;不能告诉GDB要停在哪个函数的入口。当然，你可以使用break &lt;function(type)&gt;也就是把函数的参数类型告诉GDB，以指定一个函数。否则的话，GDB会给你列出一个断点菜单供你选择你所需要的断点。你只要输入你菜单列表中的编号就可以了。如：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; (gdb) b String::after</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; [0] cancel</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; [1] all</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; [2] file:String.cc; line number:867</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; [3] file:String.cc; line number:860</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; [4] file:String.cc; line number:875</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; [5] file:String.cc; line number:853</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; [6] file:String.cc; line number:846</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; [7] file:String.cc; line number:735</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; &gt; 2 4 6</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; Breakpoint 1 at 0xb26c: file String.cc, line 867.</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; Breakpoint 2 at 0xb344: file String.cc, line 875.</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; Breakpoint 3 at 0xafcc: file String.cc, line 846.</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; Multiple breakpoints were set.</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; Use the "delete" command to delete unwanted</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp; breakpoints.</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; (gdb)</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">可见，GDB列出了所有after的重载函数，你可以选一下列表编号就行了。0表示放弃设置断点，1表示所有函数都设置断点。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">八、恢复程序运行和单步调试</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">当程序被停住了，你可以用continue命令恢复程序的运行直到程序结束，或下一个断点到来。也可以使用step或next命令单步跟踪程序。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; continue [ignore-count]</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; c [ignore-count]</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; fg [ignore-count]</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 恢复程序运行，直到程序结束，或是下一个断点到来。ignore-count表示忽略其后的断点次数。continue，c，fg三个命令都是一样的意思。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; step &lt;count&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单步跟踪，如果有函数调用，他会进入该函数。进入函数的前提是，此函数被编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加，不加表示一条条地执行，加表示执行后面的count条指令，然后再停住。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; next &lt;count&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同样单步跟踪，如果有函数调用，他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加，不加表示一条条地执行，加表示执行后面的count条指令，然后再停住。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set step-mode</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set step-mode on</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开step-mode模式，于是，在进行单步跟踪时，程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; set step-mod off</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭step-mode模式。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; finish</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行程序，直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; until 或 u</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当你厌倦了在一个循环体内单步跟踪时，这个命令可以运行程序直到退出循环体。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; stepi 或 si</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; nexti 或 ni</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单步跟踪一条机器指令！一条程序代码有可能由数条机器指令完成，stepi和nexti可以单步执行机器指令。与之一样有相同功能的命令是&#8220;display/i $pc&#8221; ，当运行完这个命令后，单步跟踪会在打出程序代码的同时打出机器指令（也就是汇编代码）</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">九、信号（Signals）</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">信号是一种软中断，是一种处理异步事件的方法。一般来说，操作系统都支持许多信号。尤其是UNIX，比较重要应用程序一般都会处理信号。UNIX定义了许多信号，比如SIGINT表示中断字符信号，也就是Ctrl+C的信号，SIGBUS表示硬件故障的信号；SIGCHLD表示子进程状态改变信号；SIGKILL表示终止程序运行的信号，等等。信号量编程是UNIX下非常重要的一种技术。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">GDB有能力在你调试程序的时候处理任何一种信号，你可以告诉GDB需要处理哪一种信号。你可以要求GDB收到你所指定的信号时，马上停住正在运行的程序，以供你进行调试。你可以用GDB的handle命令来完成这一功能。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; handle &lt;signal&gt; &lt;keywords...&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在GDB中定义一个信号处理。信号&lt;signal&gt;可以以SIG开头或不以SIG开头，可以用定义一个要处理信号的范围（如：SIGIO-SIGKILL，表示处理从SIGIO信号到SIGKILL的信号，其中包括SIGIO，SIGIOT，SIGKILL三个信号），也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号，运行程序马上会被GDB停住，以供调试。其&lt;keywords&gt;可以是以下几种关键字的一个或多个。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nostop</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当被调试的程序收到信号时，GDB不会停住程序的运行，但会打出消息告诉你收到这种信号。</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stop</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当被调试的程序收到信号时，GDB会停住你的程序。</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当被调试的程序收到信号时，GDB会显示出一条信息。</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; noprint</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当被调试的程序收到信号时，GDB不会告诉你收到信号的信息。</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; noignore</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当被调试的程序收到信号时，GDB不处理信号。这表示，GDB会把这个信号交给被调试程序会处理。</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nopass</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ignore</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当被调试的程序收到信号时，GDB不会让被调试程序来处理这个信号。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; info signals</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; info handle</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看有哪些信号在被GDB检测中。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-family: Verdana; font-size: 12pt;">十、线程（Thread Stops）</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">如果你程序是多线程的话，你可以定义你的断点是否在所有的线程上，或是在某个特定的线程。GDB很容易帮你完成这一工作。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; break &lt;linespec&gt; thread &lt;threadno&gt;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; break &lt;linespec&gt; thread &lt;threadno&gt; if ...</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID，注意，这个ID是GDB分配的，你可以通过&#8220;info threads&#8221;命令来查看正在运行程序中的线程信息。如果你不指定thread &lt;threadno&gt;则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如：</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) break frik.c:13 thread 28 if bartab &gt; lim</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp; 当你的程序被GDB停住时，所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时，所有的线程也会被恢复运行。那怕是主进程在被单步调试时。</span><br /><br /><span style="font-family: Verdana; font-size: 12pt;">本文转自：</span><a href="http://blog.csdn.net/haoel/article/details/2881" style="font-family: verdana, 'courier new'; line-height: 21px;"><span style="font-family: Verdana; font-size: 12pt;">http://blog.csdn.net/haoel/article/details/2881</span></a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/204494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-11-28 12:08 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用GDB调试程序（二）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204493.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 28 Nov 2013 04:07:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204493.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/204493.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/204493.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/204493.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">GDB的命令概貌<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">启动gdb后，就你被带入gdb的调试环境中，就可以使用gdb的命令开始调试程序了，gdb的命令可以使用help命令来查看，如下所示：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp; &nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">home</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">hchen</span><span style="color: #000000; font-size: 12pt;">&gt;</span><span style="color: #000000; font-size: 12pt;">&nbsp;gdb<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;GNU&nbsp;gdb&nbsp;</span><span style="color: #000000; font-size: 12pt;">5.1</span><span style="color: #000000; font-size: 12pt;">.</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;Copyright&nbsp;</span><span style="color: #000000; font-size: 12pt;">2002</span><span style="color: #000000; font-size: 12pt;">&nbsp;Free&nbsp;Software&nbsp;Foundation,&nbsp;Inc.<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;GDB&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">is</span><span style="color: #000000; font-size: 12pt;">&nbsp;free&nbsp;software,&nbsp;covered&nbsp;by&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License,&nbsp;and&nbsp;you&nbsp;are<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;welcome&nbsp;to&nbsp;change&nbsp;it&nbsp;and</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">or&nbsp;distribute&nbsp;copies&nbsp;of&nbsp;it&nbsp;under&nbsp;certain&nbsp;conditions.<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">show&nbsp;copying</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">&nbsp;to&nbsp;see&nbsp;the&nbsp;conditions.<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;There&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">is</span><span style="color: #000000; font-size: 12pt;">&nbsp;absolutely&nbsp;no&nbsp;warranty&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">&nbsp;GDB.&nbsp;&nbsp;Type&nbsp;</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">show&nbsp;warranty</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">&nbsp;details.<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;GDB&nbsp;was&nbsp;configured&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">as</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">i386-suse-linux</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">.<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;(gdb)&nbsp;help<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;of&nbsp;classes&nbsp;of&nbsp;commands:<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;aliases&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;Aliases&nbsp;of&nbsp;other&nbsp;commands<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;breakpoints&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;Making&nbsp;program&nbsp;stop&nbsp;at&nbsp;certain&nbsp;points<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;Examining&nbsp;data<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;files&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;Specifying&nbsp;and&nbsp;examining&nbsp;files<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;internals&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;Maintenance&nbsp;commands<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;obscure&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;Obscure&nbsp;features<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;running&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;Running&nbsp;the&nbsp;program<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;stack&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;Examining&nbsp;the&nbsp;stack<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;Status&nbsp;inquiries<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;support&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;Support&nbsp;facilities<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;tracepoints&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;Tracing&nbsp;of&nbsp;program&nbsp;execution&nbsp;without&nbsp;stopping&nbsp;the&nbsp;program<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;user</span><span style="color: #000000; font-size: 12pt;">-</span><span style="color: #000000; font-size: 12pt;">defined&nbsp;</span><span style="color: #000000; font-size: 12pt;">--</span><span style="color: #000000; font-size: 12pt;">&nbsp;User</span><span style="color: #000000; font-size: 12pt;">-</span><span style="color: #000000; font-size: 12pt;">defined&nbsp;commands<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">help</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">&nbsp;followed&nbsp;by&nbsp;a&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">class</span><span style="color: #000000; font-size: 12pt;">&nbsp;name&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">&nbsp;a&nbsp;list&nbsp;of&nbsp;commands&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">in</span><span style="color: #000000; font-size: 12pt;">&nbsp;that&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">class</span><span style="color: #000000; font-size: 12pt;">.<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">help</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">&nbsp;followed&nbsp;by&nbsp;command&nbsp;name&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">&nbsp;full&nbsp;documentation.<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;Command&nbsp;name&nbsp;abbreviations&nbsp;are&nbsp;allowed&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">if</span><span style="color: #000000; font-size: 12pt;">&nbsp;unambiguous.<br /></span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;(gdb)</span></div><p>&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">gdb的命令很多，gdb把之分成许多个种类。help命令只是例出gdb的命令种类，如果要看种类中的命令，可以使用help &lt;class&gt; 命令，如：help breakpoints，查看设置断点的所有命令。也可以直接help &lt;command&gt;来查看命令的帮助。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><br /><span style="font-size: 12pt;">gdb中，输入命令时，可以不用打全命令，只用打命令的前几个字符就可以了，当然，命令的前几个字符应该要标志着一个唯一的命令，在Linux下，你可以敲击两次TAB键来补齐命令的全称，如果有重复的，那么gdb会把其例出来。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 示例一：在进入函数func时，设置一个断点。可以敲入break func，或是直接就是b func</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; (gdb) b func</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; Breakpoint 1 at 0x8048458: file hello.c, line 10.</span><br />&nbsp;<br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 示例二：敲入b按两次TAB键，你会看到所有b打头的命令：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; (gdb) b</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; backtrace&nbsp; break&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bt</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; (gdb)</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 示例三：只记得函数的前缀，可以这样：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; (gdb) b make_ &lt;按TAB键&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; （再按下一次TAB键，你会看到:）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; make_a_section_from_file&nbsp;&nbsp;&nbsp;&nbsp; make_environ</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; make_abs_section&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; make_function_type</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; make_blockvector&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; make_pointer_type</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; make_cleanup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; make_reference_type</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; make_command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; make_symbol_completion_list</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; (gdb) b make_</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; GDB把所有make开头的函数全部例出来给你查看。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 示例四：调试C++的程序时，有可以函数名一样。如：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; (gdb) b 'bubble( M-?&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; bubble(double,double)&nbsp;&nbsp;&nbsp; bubble(int,int)</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; (gdb) b 'bubble(</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 你可以查看到C++中的所有的重载函数及参数。（注：M-?和&#8220;按两次TAB键&#8221;是一个意思）</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">要退出gdb时，只用发quit或命令简称q就行了。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">GDB中运行UNIX的shell程序<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">在gdb环境中，你可以执行UNIX的shell的命令，使用gdb的shell命令来完成：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; shell &lt;command string&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 调用UNIX的shell来执行&lt;command string&gt;，环境变量SHELL中定义的UNIX的shell将会被用来执行&lt;command string&gt;，如果SHELL没有定义，那就使用UNIX的标准shell：/bin/sh。（在Windows中使用Command.com或cmd.exe）</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">还有一个gdb命令是make：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; make &lt;make-args&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 可以在gdb中执行make命令来重新build自己的程序。这个命令等价于&#8220;shell make &lt;make-args&gt;&#8221;。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">在GDB中运行程序<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">当以gdb &lt;program&gt;方式启动gdb后，gdb会在PATH路径和当前目录中搜索&lt;program&gt;的源文件。如要确认gdb是否读到源文件，可使用l或list命令，看看gdb是否能列出源代码。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">在gdb中，运行程序使用r或是run命令。程序的运行，你有可能需要设置下面四方面的事。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">1、程序运行参数。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; set args 可指定运行时参数。（如：set args 10 20 30 40 50）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; show args 命令可以查看设置好的运行参数。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">2、运行环境。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; path &lt;dir&gt; 可设定程序的运行路径。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; show paths 查看程序的运行路径。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; set environment varname [=value] 设置环境变量。如：set env USER=hchen</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; show environment [varname] 查看环境变量。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">3、工作目录。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; cd &lt;dir&gt; 相当于shell的cd命令。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; pwd 显示当前的所在目录。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">4、程序的输入输出。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; info terminal 显示你程序用到的终端的模式。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 使用重定向控制程序输出。如：run &gt; outfile</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; tty命令可以指写输入输出的终端设备。如：tty /dev/ttyb</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">调试已运行的程序<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">两种方法：</span><br /><span style="font-size: 12pt;">1、在UNIX下用ps查看正在运行的程序的PID（进程ID），然后用gdb &lt;program&gt; PID格式挂接正在运行的程序。</span><br /><span style="font-size: 12pt;">2、先用gdb &lt;program&gt;关联上源代码，并进行gdb，在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">暂停 / 恢复程序运行<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">调试程序中，暂停程序运行是必须的，GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住，在什么条件下停住，在收到什么信号时停往等等。以便于你查看运行时的变量，以及运行时的流程。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">当进程被gdb停住时，你可以使用info program 来查看程序的是否在运行，进程号，被暂停的原因。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">在gdb中，我们可以有以下几种暂停方式：断点（BreakPoint）、观察点（WatchPoint）、捕捉点（CatchPoint）、信号（Signals）、线程停止（Thread Stops）。如果要恢复程序运行，可以使用c或是continue命令。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">一、设置断点（BreakPoint）</strong><br />&nbsp;&nbsp;&nbsp; 我们用break命令来设置断点。正面有几点设置断点的方法：<br />&nbsp;&nbsp;&nbsp; break &lt;function&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; break &lt;linenum&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在指定行号停住。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; break +offset&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; break -offset&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在当前行号的前面或后面的offset行停住。offiset为自然数。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; break filename:linenum&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在源文件filename的linenum行处停住。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; break filename:function&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在源文件filename的function函数的入口处停住。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; break *address</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在程序运行的内存地址处停住。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; break&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break命令没有参数时，表示在下一条指令处停住。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; break ... if &lt;condition&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...可以是上述的参数，condition表示条件，在条件成立时停住。比如在循环境体中，可以设置break if i=100，表示当i为100时停住程序。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 查看断点时，可使用info命令，如下所示：（注：n表示断点号）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; info breakpoints [n]&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; info break [n]&nbsp;</span><br /></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">二、设置观察点（WatchPoint）</strong>&nbsp;<br />&nbsp; &nbsp; 观察点一般来观察某个表达式（变量也是一种表达式）的值是否有变化了，如果有变化，马上停住程序。我们有下面的几种方法来设置观察点：<br />&nbsp;&nbsp;&nbsp; watch &lt;expr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为表达式（变量）expr设置一个观察点。一量表达式值有变化时，马上停住程序。&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; rwatch &lt;expr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当表达式（变量）expr被读时，停住程序。&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; awatch &lt;expr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当表达式（变量）的值被读或被写时，停住程序。&nbsp; &nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; info watchpoints<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出当前所设置了的所有观察点。</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">三、设置捕捉点（CatchPoint）</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 你可设置捕捉点来补捉程序运行时的一些事件。如：载入共享库（动态链接库）或是C++的异常。设置捕捉点的格式为：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; catch &lt;event&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当event发生时，停住程序。event可以是下面的内容：</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、throw 一个C++抛出的异常。（throw为关键字）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、catch 一个C++捕捉到的异常。（catch为关键字）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、exec 调用系统调用exec时。（exec为关键字，目前此功能只在HP-UX下有用）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、fork 调用系统调用fork时。（fork为关键字，目前此功能只在HP-UX下有用）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、vfork 调用系统调用vfork时。（vfork为关键字，目前此功能只在HP-UX下有用）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、load 或 load &lt;libname&gt; 载入共享库（动态链接库）时。（load为关键字，目前此功能只在HP-UX下有用）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、unload 或 unload &lt;libname&gt; 卸载共享库（动态链接库）时。（unload为关键字，目前此功能只在HP-UX下有用）</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; tcatch &lt;event&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只设置一次捕捉点，当程序停住以后，应点被自动删除。</span><br /><br /><span style="font-size: 12pt;">本文转自：</span><a href="http://blog.csdn.net/haoel/article/details/2880" style="font-family: verdana, 'courier new'; line-height: 21px;"><span style="font-size: 12pt;">http://blog.csdn.net/haoel/article/details/2880</span></a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/204493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-11-28 12:07 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用GDB调试程序（一）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204492.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 28 Nov 2013 04:03:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204492.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/204492.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/204492.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/204492.html</trackback:ping><description><![CDATA[<p align="center" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">用GDB调试程序</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">GDB概述<br />&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许，各位比较喜欢那种图形界面方式的，像VC、BCB等IDE的调试，但如果你是在UNIX平台下做软件，你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓&#8220;寸有所长，尺有所短&#8221;就是这个道理。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">一般来说，GDB主要帮忙你完成下面四个方面的功能：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 1、启动你的程序，可以按照你的自定义的要求随心所欲的运行程序。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 2、可让被调试的程序在你所指定的调置的断点处停住。（断点可以是条件表达式）</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 3、当程序被停住时，可以检查此时你的程序中所发生的事。</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 4、动态的改变你程序的执行环境。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">从上面看来，GDB和一般的调试工具没有什么两样，基本上也是完成这些功能，不过在细节上，你会发现GDB这个调试工具的强大，大家可能比较习惯了图形化的调试工具，但有时候，命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">一个调试示例<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">源程序：tst.c</span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="font-family: Verdana; font-size: 12pt;">#include&nbsp;&lt;</span><span style="font-family: Verdana; font-size: 12pt;">stdio.h</span><span style="font-family: Verdana; font-size: 12pt;">&gt;</span><br /><br /><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">int</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;func(</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">int</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;n)</span><br /><span style="font-family: Verdana; font-size: 12pt;">{</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">int</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;sum</span><span style="font-family: Verdana; font-size: 12pt;">=</span><span style="font-family: Verdana; font-size: 12pt;">0</span><span style="font-family: Verdana; font-size: 12pt;">,i;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">for</span><span style="font-family: Verdana; font-size: 12pt;">(i</span><span style="font-family: Verdana; font-size: 12pt;">=</span><span style="font-family: Verdana; font-size: 12pt;">0</span><span style="font-family: Verdana; font-size: 12pt;">;&nbsp;i</span><span style="font-family: Verdana; font-size: 12pt;">&lt;</span><span style="font-family: Verdana; font-size: 12pt;">n;&nbsp;i</span><span style="font-family: Verdana; font-size: 12pt;">++</span><span style="font-family: Verdana; font-size: 12pt;">)</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum</span><span style="font-family: Verdana; font-size: 12pt;">+=</span><span style="font-family: Verdana; font-size: 12pt;">i;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">return</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;sum;</span><br /><span style="font-family: Verdana; font-size: 12pt;">}</span><br /><br /><span style="font-family: Verdana; font-size: 12pt;">main()</span><br /><span style="font-family: Verdana; font-size: 12pt;">{</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">int</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;i;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">long</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;result&nbsp;</span><span style="font-family: Verdana; font-size: 12pt;">=</span>&nbsp;<span style="font-family: Verdana; font-size: 12pt;">0</span><span style="font-family: Verdana; font-size: 12pt;">;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">for</span><span style="font-family: Verdana; font-size: 12pt;">(i</span><span style="font-family: Verdana; font-size: 12pt;">=</span><span style="font-family: Verdana; font-size: 12pt;">1</span><span style="font-family: Verdana; font-size: 12pt;">;&nbsp;i</span><span style="font-family: Verdana; font-size: 12pt;">&lt;=</span><span style="font-family: Verdana; font-size: 12pt;">100</span><span style="font-family: Verdana; font-size: 12pt;">;&nbsp;i</span><span style="font-family: Verdana; font-size: 12pt;">++</span><span style="font-family: Verdana; font-size: 12pt;">)</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="font-family: Verdana; font-size: 12pt;">+=</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;i;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="font-family: Verdana; font-size: 12pt;">"</span><span style="font-family: Verdana; font-size: 12pt;">result[1-100]&nbsp;=&nbsp;%d&nbsp;/n</span><span style="font-family: Verdana; font-size: 12pt;">"</span><span style="font-family: Verdana; font-size: 12pt;">,&nbsp;result&nbsp;);</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="font-family: Verdana; font-size: 12pt;">"</span><span style="font-family: Verdana; font-size: 12pt;">result[1-250]&nbsp;=&nbsp;%d&nbsp;/n</span><span style="font-family: Verdana; font-size: 12pt;">"</span><span style="font-family: Verdana; font-size: 12pt;">,&nbsp;func(</span><span style="font-family: Verdana; font-size: 12pt;">250</span><span style="font-family: Verdana; font-size: 12pt;">)&nbsp;);<br /></span><span style="color: #333333; font-size: 12pt;">}</span></div><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">编译生成执行文件：（Linux下）</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; hchen/test&gt; cc -g tst.c -o tst</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">使用GDB调试：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 12pt;">hchen</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">test</span><span style="color: #000000; font-size: 12pt;">&gt;</span><span style="color: #000000; font-size: 12pt;">&nbsp;gdb&nbsp;tst&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;----------</span><span style="color: #000000; font-size: 12pt;">&nbsp;启动GDB<br /></span><span style="color: #000000; font-size: 12pt;">GNU&nbsp;gdb&nbsp;</span><span style="color: #000000; font-size: 12pt;">5.1</span><span style="color: #000000; font-size: 12pt;">.</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">Copyright&nbsp;</span><span style="color: #000000; font-size: 12pt;">2002</span><span style="color: #000000; font-size: 12pt;">&nbsp;Free&nbsp;Software&nbsp;Foundation,&nbsp;Inc.<br /></span><span style="color: #000000; font-size: 12pt;">GDB&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">is</span><span style="color: #000000; font-size: 12pt;">&nbsp;free&nbsp;software,&nbsp;covered&nbsp;by&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License,&nbsp;and&nbsp;you&nbsp;are<br /></span><span style="color: #000000; font-size: 12pt;">welcome&nbsp;to&nbsp;change&nbsp;it&nbsp;and</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">or&nbsp;distribute&nbsp;copies&nbsp;of&nbsp;it&nbsp;under&nbsp;certain&nbsp;conditions.<br /></span><span style="color: #000000; font-size: 12pt;">Type&nbsp;</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">show&nbsp;copying</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">&nbsp;to&nbsp;see&nbsp;the&nbsp;conditions.<br /></span><span style="color: #000000; font-size: 12pt;">There&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">is</span><span style="color: #000000; font-size: 12pt;">&nbsp;absolutely&nbsp;no&nbsp;warranty&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">&nbsp;GDB.&nbsp;&nbsp;Type&nbsp;</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">show&nbsp;warranty</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">&nbsp;details.<br /></span><span style="color: #000000; font-size: 12pt;">This&nbsp;GDB&nbsp;was&nbsp;configured&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">as</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">i386-suse-linux</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; "><img src="http://www.cppblog.com/Images/dot.gif" alt="" /><br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;--------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;l命令相当于list，从第一行开始例出原码。<br /></span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;</span><span style="color: #000000; font-size: 12pt;">stdio.h</span><span style="color: #000000; font-size: 12pt;">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">2</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">3</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">int</span><span style="color: #000000; font-size: 12pt;">&nbsp;func(</span><span style="color: #0000ff; font-size: 12pt;">int</span><span style="color: #000000; font-size: 12pt;">&nbsp;n)<br /></span><span style="color: #000000; font-size: 12pt;">4</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000; font-size: 12pt;">5</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">int</span><span style="color: #000000; font-size: 12pt;">&nbsp;sum</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">0</span><span style="color: #000000; font-size: 12pt;">,i;<br /></span><span style="color: #000000; font-size: 12pt;">6</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">(i</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">0</span><span style="color: #000000; font-size: 12pt;">;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">&lt;</span><span style="color: #000000; font-size: 12pt;">n;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">++</span><span style="color: #000000; font-size: 12pt;">)<br /></span><span style="color: #000000; font-size: 12pt;">7</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000; font-size: 12pt;">8</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum</span><span style="color: #000000; font-size: 12pt;">+=</span><span style="color: #000000; font-size: 12pt;">i;<br /></span><span style="color: #000000; font-size: 12pt;">9</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-size: 12pt;">10</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">return</span><span style="color: #000000; font-size: 12pt;">&nbsp;sum;<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;--------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;直接回车表示，重复上一次命令<br /></span><span style="color: #000000; font-size: 12pt;">11</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-size: 12pt;">12</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">13</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">14</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main()<br /></span><span style="color: #000000; font-size: 12pt;">15</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000; font-size: 12pt;">16</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">int</span><span style="color: #000000; font-size: 12pt;">&nbsp;i;<br /></span><span style="color: #000000; font-size: 12pt;">17</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">long</span><span style="color: #000000; font-size: 12pt;">&nbsp;result&nbsp;</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">0</span><span style="color: #000000; font-size: 12pt;">;<br /></span><span style="color: #000000; font-size: 12pt;">18</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">(i</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">&lt;=</span><span style="color: #000000; font-size: 12pt;">100</span><span style="color: #000000; font-size: 12pt;">;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">++</span><span style="color: #000000; font-size: 12pt;">)<br /></span><span style="color: #000000; font-size: 12pt;">19</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000; font-size: 12pt;">20</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000; font-size: 12pt;">+=</span><span style="color: #000000; font-size: 12pt;">&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">break</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">16</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;--------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;设置断点，在源程序第16行处。<br /></span><span style="color: #000000; font-size: 12pt;">Breakpoint&nbsp;</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">&nbsp;at&nbsp;</span><span style="color: #000000; font-size: 12pt;">0x8048496</span><span style="color: #000000; font-size: 12pt;">:&nbsp;file&nbsp;tst.c,&nbsp;line&nbsp;</span><span style="color: #000000; font-size: 12pt;">16</span><span style="color: #000000; font-size: 12pt;">.<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">break</span><span style="color: #000000; font-size: 12pt;">&nbsp;func&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;--------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;设置断点，在函数func()入口处。<br /></span><span style="color: #000000; font-size: 12pt;">Breakpoint&nbsp;</span><span style="color: #000000; font-size: 12pt;">2</span><span style="color: #000000; font-size: 12pt;">&nbsp;at&nbsp;</span><span style="color: #000000; font-size: 12pt;">0x8048456</span><span style="color: #000000; font-size: 12pt;">:&nbsp;file&nbsp;tst.c,&nbsp;line&nbsp;</span><span style="color: #000000; font-size: 12pt;">5</span><span style="color: #000000; font-size: 12pt;">.<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;info&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">break</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;--------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;查看断点信息。<br /></span><span style="color: #000000; font-size: 12pt;">Num&nbsp;Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disp&nbsp;Enb&nbsp;Address&nbsp;&nbsp;&nbsp;&nbsp;What<br /></span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;breakpoint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keep&nbsp;y&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">0x08048496</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">in</span><span style="color: #000000; font-size: 12pt;">&nbsp;main&nbsp;at&nbsp;tst.c:</span><span style="color: #000000; font-size: 12pt;">16</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">2</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;breakpoint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keep&nbsp;y&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">0x08048456</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">in</span><span style="color: #000000; font-size: 12pt;">&nbsp;func&nbsp;at&nbsp;tst.c:</span><span style="color: #000000; font-size: 12pt;">5</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;---------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;运行程序，run命令简写<br /></span><span style="color: #000000; font-size: 12pt;">Starting&nbsp;program:&nbsp;</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">home</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">hchen</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">test</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">tst<br /></span><span style="color: #000000; font-size: 12pt;">Breakpoint&nbsp;</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">,&nbsp;main&nbsp;()&nbsp;at&nbsp;tst.c:</span><span style="color: #000000; font-size: 12pt;">17</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;----------</span><span style="color: #000000; font-size: 12pt;">&nbsp;在断点处停住。<br /></span><span style="color: #000000; font-size: 12pt;">17</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">long</span><span style="color: #000000; font-size: 12pt;">&nbsp;result&nbsp;</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">0</span><span style="color: #000000; font-size: 12pt;">;<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;---------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;单条语句执行，next命令简写。<br /></span><span style="color: #000000; font-size: 12pt;">18</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">(i</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">&lt;=</span><span style="color: #000000; font-size: 12pt;">100</span><span style="color: #000000; font-size: 12pt;">;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">++</span><span style="color: #000000; font-size: 12pt;">)<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;n<br /></span><span style="color: #000000; font-size: 12pt;">20</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000; font-size: 12pt;">+=</span><span style="color: #000000; font-size: 12pt;">&nbsp;i;<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;n<br /></span><span style="color: #000000; font-size: 12pt;">18</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">(i</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">&lt;=</span><span style="color: #000000; font-size: 12pt;">100</span><span style="color: #000000; font-size: 12pt;">;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">++</span><span style="color: #000000; font-size: 12pt;">)<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;n<br /></span><span style="color: #000000; font-size: 12pt;">20</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000; font-size: 12pt;">+=</span><span style="color: #000000; font-size: 12pt;">&nbsp;i;<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;---------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;继续运行程序，continue命令简写。<br /></span><span style="color: #000000; font-size: 12pt;">Continuing.<br /></span><span style="color: #000000; font-size: 12pt;">result[</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">-</span><span style="color: #000000; font-size: 12pt;">100</span><span style="color: #000000; font-size: 12pt;">]&nbsp;</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">5050</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;----------</span><span style="color: #000000; font-size: 12pt;">程序输出。<br /></span><span style="color: #000000; font-size: 12pt;">Breakpoint&nbsp;</span><span style="color: #000000; font-size: 12pt;">2</span><span style="color: #000000; font-size: 12pt;">,&nbsp;func&nbsp;(n</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">250</span><span style="color: #000000; font-size: 12pt;">)&nbsp;at&nbsp;tst.c:</span><span style="color: #000000; font-size: 12pt;">5</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">5</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">int</span><span style="color: #000000; font-size: 12pt;">&nbsp;sum</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">0</span><span style="color: #000000; font-size: 12pt;">,i;<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;n<br /></span><span style="color: #000000; font-size: 12pt;">6</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">(i</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">&lt;=</span><span style="color: #000000; font-size: 12pt;">n;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">++</span><span style="color: #000000; font-size: 12pt;">)<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;p&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;---------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;打印变量i的值，print命令简写。<br /></span><span style="color: #000000; font-size: 12pt;">$</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">134513808</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;n<br /></span><span style="color: #000000; font-size: 12pt;">8</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum</span><span style="color: #000000; font-size: 12pt;">+=</span><span style="color: #000000; font-size: 12pt;">i;<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;n<br /></span><span style="color: #000000; font-size: 12pt;">6</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">(i</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">&lt;=</span><span style="color: #000000; font-size: 12pt;">n;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">++</span><span style="color: #000000; font-size: 12pt;">)<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;p&nbsp;sum<br /></span><span style="color: #000000; font-size: 12pt;">$</span><span style="color: #000000; font-size: 12pt;">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;n<br /></span><span style="color: #000000; font-size: 12pt;">8</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum</span><span style="color: #000000; font-size: 12pt;">+=</span><span style="color: #000000; font-size: 12pt;">i;<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;p&nbsp;i<br /></span><span style="color: #000000; font-size: 12pt;">$</span><span style="color: #000000; font-size: 12pt;">3</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">2</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;n<br /></span><span style="color: #000000; font-size: 12pt;">6</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">(i</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">&lt;=</span><span style="color: #000000; font-size: 12pt;">n;&nbsp;i</span><span style="color: #000000; font-size: 12pt;">++</span><span style="color: #000000; font-size: 12pt;">)<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;p&nbsp;sum<br /></span><span style="color: #000000; font-size: 12pt;">$</span><span style="color: #000000; font-size: 12pt;">4</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">3</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;bt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;---------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;查看函数堆栈。<br /></span><span style="color: #000000; font-size: 12pt;">#</span><span style="color: #000000; font-size: 12pt;">0</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;func&nbsp;(n</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">250</span><span style="color: #000000; font-size: 12pt;">)&nbsp;at&nbsp;tst.c:</span><span style="color: #000000; font-size: 12pt;">5</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">#</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">0x080484e4</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">in</span><span style="color: #000000; font-size: 12pt;">&nbsp;main&nbsp;()&nbsp;at&nbsp;tst.c:</span><span style="color: #000000; font-size: 12pt;">24</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">#</span><span style="color: #000000; font-size: 12pt;">2</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">0x400409ed</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">in</span><span style="color: #000000; font-size: 12pt;">&nbsp;__libc_start_main&nbsp;()&nbsp;from&nbsp;</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">lib</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">libc.so.</span><span style="color: #000000; font-size: 12pt;">6</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;finish&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;---------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;退出函数。<br /></span><span style="color: #000000; font-size: 12pt;">Run&nbsp;till&nbsp;exit&nbsp;from&nbsp;#</span><span style="color: #000000; font-size: 12pt;">0</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;func&nbsp;(n</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; font-size: 12pt;">250</span><span style="color: #000000; font-size: 12pt;">)&nbsp;at&nbsp;tst.c:</span><span style="color: #000000; font-size: 12pt;">5</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">0x080484e4</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">in</span><span style="color: #000000; font-size: 12pt;">&nbsp;main&nbsp;()&nbsp;at&nbsp;tst.c:</span><span style="color: #000000; font-size: 12pt;">24</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">24</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">result[1-250]&nbsp;=&nbsp;%d&nbsp;/n</span><span style="color: #000000; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">,&nbsp;func(</span><span style="color: #000000; font-size: 12pt;">250</span><span style="color: #000000; font-size: 12pt;">)&nbsp;);<br /></span><span style="color: #000000; font-size: 12pt;">Value&nbsp;returned&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">is</span><span style="color: #000000; font-size: 12pt;">&nbsp;$</span><span style="color: #000000; font-size: 12pt;">6</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">31375</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;---------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;继续运行。<br /></span><span style="color: #000000; font-size: 12pt;">Continuing.<br /></span><span style="color: #000000; font-size: 12pt;">result[</span><span style="color: #000000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">-</span><span style="color: #000000; font-size: 12pt;">250</span><span style="color: #000000; font-size: 12pt;">]&nbsp;</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">31375</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;----------</span><span style="color: #000000; font-size: 12pt;">程序输出。<br /></span><span style="color: #000000; font-size: 12pt;">Program&nbsp;exited&nbsp;with&nbsp;code&nbsp;</span><span style="color: #000000; font-size: 12pt;">027</span><span style="color: #000000; font-size: 12pt;">.&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;--------</span><span style="color: #000000; font-size: 12pt;">程序退出，调试结束。<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 12pt;">&lt;---------------------</span><span style="color: #000000; font-size: 12pt;">&nbsp;退出gdb。<br /></span><span style="color: #000000; font-size: 12pt;">hchen</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">test</span><span style="color: #000000; font-size: 12pt;">&gt;</span></div><p>&nbsp;<span style="background-color: #ffffff; color: #333333; font-family: Arial; line-height: 26px; font-size: 12pt;">好了，有了以上的感性认识，还是让我们来系统地认识一下gdb吧。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="font-size: 12pt;">使用GDB<br />&#8212;&#8212;&#8212;&#8212;</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序，首先在编译时，我们必须要把调试信息加到可执行文件中。使用编译器（cc/gcc/g++）的 -g 参数可以做到这一点。如：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; &gt; cc -g hello.c -o hello</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; &gt; g++ -g hello.cpp -o hello</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">如果没有-g，你将看不见程序的函数名、变量名，所代替的全是运行时的内存地址。当你用-g把调试信息加入之后，并成功编译目标代码以后，让我们来看看如何用gdb来调试他。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">启动GDB的方法有以下几种：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 1、gdb &lt;program&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; program也就是你的执行文件，一般在当然目录下。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 2、gdb &lt;program&gt; core</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用gdb同时调试一个运行程序和core文件，core是程序非法执行后core dump后产生的文件。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 3、gdb &lt;program&gt; &lt;PID&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你的程序是一个服务程序，那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去，并调试他。program应该在PATH环境变量中搜索得到。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">GDB启动时，可以加上一些GDB的启动开关，详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; -symbols &lt;file&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; -s &lt;file&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 从指定文件中读取符号表。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; -se file&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 从指定文件中读取符号表信息，并把他用在可执行文件中。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; -core &lt;file&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; -c &lt;file&gt;&nbsp;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 调试时core dump的core文件。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; -directory &lt;directory&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; -d &lt;directory&gt;</span><br /><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; 加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。</span><br /><br /><span style="font-size: 12pt;">本文转自：</span><a href="http://blog.csdn.net/haoel/article/details/2879" style="font-family: verdana, 'courier new'; line-height: 21px;"><span style="font-size: 12pt;">http://blog.csdn.net/haoel/article/details/2879</span></a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/204492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-11-28 12:03 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GDB中应该知道的几个调试方法（转载）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204488.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 28 Nov 2013 03:12:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204488.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/204488.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/204488.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/204488.html</trackback:ping><description><![CDATA[<h4><span style="font-size: 12pt;">一、多线程调试</span></h4><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">多线程调试可能是问得最多的。其实，重要就是下面几个命令：</span></p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">info thread 查看当前进程的线程。</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">thread &lt;ID&gt; 切换调试的线程为指定ID的线程。</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">break file.c:100 thread all &nbsp;在file.c文件第100行处为所有经过这里的线程设置断点。</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">set scheduler-locking off|on|step，这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候，其他线程也是同时执行的，怎么只让被调试程序执行呢？通过这个命令就可以实现这个需求。</span><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">off 不锁定任何线程，也就是所有线程都执行，这是默认值。</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">on 只有当前被调试程序会执行。</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">step 在单步的时候，除了next过一个函数的情况(熟悉情况的人可能知道，这其实是一个设置断点然后continue的行为)以外，只有当前线程会执行。</span></li></ul></li></ul><h4><span style="font-size: 12pt;">二、调试宏</span></h4><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">这个问题超多。在GDB下，我们无法print宏定义，因为宏是预编译的。但是我们还是有办法来调试宏，这个需要GCC的配合。</span></p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">在GCC编译程序的时候，加上</span><strong style="font-size: 12pt;">-ggdb3</strong>参数，这样，你就可以调试宏了。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">另外，你可以使用下述的GDB的宏调试命令&nbsp;来查看相关的宏。</span></p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">info macro &#8211; 你可以查看这个宏在哪些文件里被引用了，以及宏定义是什么样的。</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">macro &#8211; 你可以查看宏展开的样子。</span></li></ul><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"></p><h4><span style="font-size: 12pt;">三、源文件</span></h4><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">这个问题问的也是很多的，太多的朋友都说找不到源文件。在这里我想提醒大家做下面的检查：</span></p><ol style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">编译程序员是否加上了-g参数以包含debug信息。</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">路径是否设置正确了。使用GDB的directory命令来设置源文件的目录。</span></li></ol><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">下面给一个调试/bin/ls的示例（ubuntu下）</span><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 12pt;">$&nbsp;apt</span><span style="color: #000000; font-size: 12pt;">-</span><span style="color: #000000; font-size: 12pt;">get&nbsp;source&nbsp;coreutils<br /></span><span style="color: #000000; font-size: 12pt;">$&nbsp;sudo&nbsp;apt</span><span style="color: #000000; font-size: 12pt;">-</span><span style="color: #000000; font-size: 12pt;">get&nbsp;install&nbsp;coreutils</span><span style="color: #000000; font-size: 12pt;">-</span><span style="color: #000000; font-size: 12pt;">dbgsym<br /></span><span style="color: #000000; font-size: 12pt;">$&nbsp;gdb&nbsp;</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">bin</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">ls<br /></span><span style="color: #000000; font-size: 12pt;">GNU&nbsp;gdb&nbsp;(GDB)&nbsp;</span><span style="color: #800000; font-size: 12pt;">7.1</span><span style="color: #000000; font-size: 12pt;">-</span><span style="color: #000000; font-size: 12pt;">ubuntu<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;list&nbsp;main<br /></span><span style="color: #800000; font-size: 12pt;">1192</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;ls</span><span style="color: #000000; font-size: 12pt;">.</span><span style="color: #000000; font-size: 12pt;">c</span><span style="color: #000000; font-size: 12pt;">:</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">No</span><span style="color: #000000; font-size: 12pt;">&nbsp;such&nbsp;file&nbsp;or&nbsp;directory</span><span style="color: #000000; font-size: 12pt;">.</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">in&nbsp;ls</span><span style="color: #000000; font-size: 12pt;">.</span><span style="color: #000000; font-size: 12pt;">c<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;directory&nbsp;</span><span style="color: #000000; font-size: 12pt;">~/</span><span style="color: #000000; font-size: 12pt;">src</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">coreutils</span><span style="color: #000000; font-size: 12pt;">-</span><span style="color: #800000; font-size: 12pt;">7.4</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">src</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">Source&nbsp;directories&nbsp;searched</span><span style="color: #000000; font-size: 12pt;">:</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">home</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">hchen</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">src</span><span style="color: #000000; font-size: 12pt;">/</span><span style="color: #000000; font-size: 12pt;">coreutils</span><span style="color: #000000; font-size: 12pt;">-</span><span style="color: #800000; font-size: 12pt;">7.4</span><span style="color: #000000; font-size: 12pt;">:</span><span style="color: #800080; font-size: 12pt;">$cdir</span><span style="color: #000000; font-size: 12pt;">:</span><span style="color: #800080; font-size: 12pt;">$cwd</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;list&nbsp;main<br /></span><span style="color: #800000; font-size: 12pt;">1192</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #800000; font-size: 12pt;">1193</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #800000; font-size: 12pt;">1194</span><span style="color: #000000; "><br /></span><span style="color: #800000; font-size: 12pt;">1195</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">int</span><span style="color: #000000; "><br /></span><span style="color: #800000; font-size: 12pt;">1196</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;main&nbsp;(</span><span style="color: #0000ff; font-size: 12pt;">int</span><span style="color: #000000; font-size: 12pt;">&nbsp;argc</span><span style="color: #000000; font-size: 12pt;">,</span><span style="color: #000000; font-size: 12pt;">&nbsp;char&nbsp;</span><span style="color: #000000; font-size: 12pt;">**</span><span style="color: #000000; font-size: 12pt;">argv)<br /></span><span style="color: #800000; font-size: 12pt;">1197</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #800000; font-size: 12pt;">1198</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">int</span><span style="color: #000000; font-size: 12pt;">&nbsp;i;<br /></span><span style="color: #800000; font-size: 12pt;">1199</span><span style="color: #000000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;pending&nbsp;</span><span style="color: #000000; font-size: 12pt;">*</span><span style="color: #000000; font-size: 12pt;">thispend;<br /></span><span style="color: #800000; font-size: 12pt;">1200</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">int</span><span style="color: #000000; font-size: 12pt;">&nbsp;n_files;<br /></span><span style="color: #800000; font-size: 12pt;">1201</span></div><h4><span style="font-size: 12pt;">四、条件断点</span></h4><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">条件断点是语法是：break &nbsp;[where] if [condition]，这种断点真是非常管用。尤其是在一个循环或递归中，或是要监视某个变量。注意，这个设置是在GDB中的，只不过每经过那个断点时GDB会帮你检查一下条件是否满足。</span></p><h4><span style="font-size: 12pt;">五、命令行参数</span></h4><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">有时候，我们需要调试的程序需要有命令行参数，很多朋友都不知道怎么设置调试的程序的命令行参数。其实，有两种方法：</span></p><ol style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">gdb命令行的 &#8211;args 参数</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">gdb环境中 set args命令。</span></li></ol><h4><span style="font-size: 12pt;">六、gdb的变量</span></h4><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">有时候，在调试程序时，我们不单单只是查看运行时的变量，我们还可以直接设置程序中的变量，以模拟一些很难在测试中出现的情况，比较一些出错，或是switch的分支语句。使用set命令可以修改程序中的变量。</span></p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">另外，你知道gdb中也可以有变量吗？就像shell一样，gdb中的变量以$开头，比如你想打印一个数组中的个个元素，你可以这样：</span><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;set&nbsp;</span><span style="color: #800080; font-size: 12pt;">$i</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 12pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; font-size: 12pt;">0</span><span style="color: #000000; "><br />&nbsp;<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;p&nbsp;a[</span><span style="color: #800080; font-size: 12pt;">$i</span><span style="color: #000000; font-size: 12pt;">++</span><span style="color: #000000; font-size: 12pt;">]<br />&nbsp;<br /></span><span style="color: #000000; "><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; font-size: 12pt;">#</span><span style="color: #008000; font-size: 12pt;">然后就一路回车下去了</span></div><p>&nbsp;</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">当然，这里只是给一个示例，表示程序的变量和gdb的变量是可以交互的。</span></p><h4><span style="font-size: 12pt;">七、x命令</span></h4><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">也许，你很喜欢用p命令。所以，当你不知道变量名的时候，你可能会手足无措，因为p命令总是需要一个变量名的。x命令是用来查看内存的，在gdb中 &#8220;help x&#8221; 你可以查看其帮助。</span></p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">x/x 以十六进制输出</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">x/d 以十进制输出</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">x/c 以单字符输出</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">x/i &nbsp;反汇编 &#8211; 通常，我们会使用&nbsp;</span><code><span style="font-size: 12pt;">x/10i $ip-20 来查看当前的汇编（$ip是指令寄存器）</span></code></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-size: 12pt;">x/s 以字符串输出</span></li></ul><h4><span style="font-size: 12pt;">八、command命令</span></h4><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">有一些朋友问我如何自动化调试。这里向大家介绍command命令，简单的理解一下，其就是把一组gdb的命令打包，有点像字处理软件的&#8220;宏&#8221;。下面是一个示例：</span><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;break&nbsp;func<br /></span><span style="color: #000000; font-size: 12pt;">Breakpoint&nbsp;</span><span style="color: #800000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">&nbsp;at&nbsp;</span><span style="color: #800000; font-size: 12pt;">0x3475678</span><span style="color: #000000; font-size: 12pt;">:</span><span style="color: #000000; font-size: 12pt;">&nbsp;file&nbsp;test</span><span style="color: #000000; font-size: 12pt;">.</span><span style="color: #000000; font-size: 12pt;">c</span><span style="color: #000000; font-size: 12pt;">,</span><span style="color: #000000; font-size: 12pt;">&nbsp;line&nbsp;</span><span style="color: #800000; font-size: 12pt;">12</span><span style="color: #000000; font-size: 12pt;">.</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">(gdb)&nbsp;command&nbsp;</span><span style="color: #800000; font-size: 12pt;">1</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">Type&nbsp;commands&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">for</span><span style="color: #000000; font-size: 12pt;">&nbsp;when&nbsp;breakpoint&nbsp;</span><span style="color: #800000; font-size: 12pt;">1</span><span style="color: #000000; font-size: 12pt;">&nbsp;is&nbsp;hit</span><span style="color: #000000; font-size: 12pt;">,</span><span style="color: #000000; font-size: 12pt;">&nbsp;one&nbsp;per&nbsp;line</span><span style="color: #000000; font-size: 12pt;">.</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">End&nbsp;with&nbsp;a&nbsp;line&nbsp;saying&nbsp;just&nbsp;</span><span style="color: #000000; font-weight: bold; font-size: 12pt;">"</span><span style="color: #000000; font-weight: bold; font-size: 12pt;">end</span><span style="color: #000000; font-weight: bold; font-size: 12pt;">"</span><span style="color: #000000; font-size: 12pt;">.</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 12pt;">&gt;</span><span style="color: #0000ff; font-size: 12pt;">print</span><span style="color: #000000; font-size: 12pt;">&nbsp;arg1<br /></span><span style="color: #000000; font-size: 12pt;">&gt;</span><span style="color: #0000ff; font-size: 12pt;">print</span><span style="color: #000000; font-size: 12pt;">&nbsp;arg2<br /></span><span style="color: #000000; font-size: 12pt;">&gt;</span><span style="color: #0000ff; font-size: 12pt;">print</span><span style="color: #000000; font-size: 12pt;">&nbsp;arg3<br /></span><span style="color: #000000; font-size: 12pt;">&gt;</span><span style="color: #000000; font-size: 12pt;">end<br /></span><span style="color: #000000; font-size: 12pt;">(gdb)</span></div><p>&nbsp;</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">当我们的断点到达时，自动执行command中的三个命令，把func的三个参数值打出来。</span></p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><span style="font-size: 12pt;">（全文完）</span><br /><br /><span style="font-size: 12pt;">本文转自：</span><a href="http://coolshell.cn/articles/3643.html" style="font-family: verdana, 'courier new'; line-height: 21px;"><span style="font-size: 12pt;">http://coolshell.cn/articles/3643.html</span></a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/204488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-11-28 11:12 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简明 Vim 练级攻略（转）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204486.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 28 Nov 2013 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204486.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/204486.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/204486.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/204486.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">vim的学习曲线相当的大（参看<a title="主流文本编辑器学习曲线" href="http://coolshell.cn/articles/3125.html" target="_blank" style="color: #2970a6; text-decoration: none;">各种文本编辑器的学习曲线</a>），所以，如果你一开始看到的是一大堆VIM的命令分类，你一定会对这个编辑器失去兴趣的。下面的文章翻译自《<a href="http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/" target="_blank" style="color: #2970a6; text-decoration: none;">Learn Vim Progressively</a>》，我觉得这是给新手最好的VIM的升级教程了，没有列举所有的命令，只是列举了那些最有用的命令。非常不错。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;正文开始&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">你想以最快的速度学习人类史上最好的文本编辑器VIM吗？你先得懂得如何在VIM幸存下来，然后一点一点地学习各种戏法。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><a href="http://www.vim.org/" style="color: #2970a6; text-decoration: none;">Vim</a>&nbsp;the Six Billion Dollar editor</p><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><p style="margin: 0px 0px 10px; padding: 0px;">Better, Stronger, Faster.</p></blockquote><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">学习&nbsp;<a href="http://www.vim.org/" style="color: #2970a6; text-decoration: none;">vim</a>&nbsp;并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文本编辑器了，非常地难学，但是却不可思议地好用。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">我建议下面这四个步骤：</p><ol style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">存活</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">感觉良好</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">觉得更好，更强，更快</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">使用VIM的超能力</li></ol><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">当你走完这篇文章，你会成为一个vim的 superstar。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">在开始学习以前，我需要给你一些警告：</p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">学习vim在开始时是痛苦的。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">需要时间</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">需要不断地练习，就像你学习一个乐器一样。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">不要期望你能在3天内把vim练得比别的编辑器更有效率。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">事实上，你需要2周时间的苦练，而不是3天。</li></ul><div style="margin: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"></div><h4>第一级 &#8211; 存活</h4><ol style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">安装&nbsp;<a href="http://www.vim.org/" style="color: #2970a6; text-decoration: none;">vim</a></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">启动 vim</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><strong>什么也别干！</strong>请先阅读</li></ol><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">当你安装好一个编辑器后，你一定会想在其中输入点什么东西，然后看看这个编辑器是什么样子。但vim不是这样的，请按照下面的命令操作：</p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">启 动Vim后，vim在&nbsp;<em>Normal</em>&nbsp;模式下。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">让我们进入&nbsp;<em>Insert</em>&nbsp;模式，请按下键 i 。(陈皓注：你会看到vim左下角有一个&#8211;insert&#8211;字样，表示，你可以以插入的方式输入了）</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">此时，你可以输入文本了，就像你用&#8220;记事本&#8221;一样。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">如果你想返回&nbsp;<em>Normal</em>&nbsp;模式，请按&nbsp;<code>ESC</code>&nbsp;键。</li></ul><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">现在，你知道如何在&nbsp;<em>Insert</em>&nbsp;和&nbsp;<em>Normal</em>&nbsp;模式下切换了。下面是一些命令，可以让你在&nbsp;<em>Normal</em>&nbsp;模式下幸存下来：</p><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>i</code>&nbsp;&#8594;&nbsp;<em>Insert</em>&nbsp;模式，按&nbsp;<code>ESC</code>&nbsp;回到&nbsp;<em>Normal</em>&nbsp;模式.</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>x</code>&nbsp;&#8594; 删当前光标所在的一个字符。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>:wq</code>&nbsp;&#8594; 存盘 + 退出 (<code>:w</code>&nbsp;存盘,&nbsp;<code>:q</code>&nbsp;退出) &nbsp; （陈皓注：:w 后可以跟文件名）</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>dd</code>&nbsp;&#8594; 删除当前行，并把删除的行存到剪贴板里</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>p</code>&nbsp;&#8594; 粘贴剪贴板</li></ul><p style="margin: 0px 0px 10px; padding: 0px;"><strong>推荐</strong>:</p><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>hjkl</code>&nbsp;(强例推荐使用其移动光标，但不必需) &#8594;你也可以使用光标键 (&#8592;&#8595;&#8593;&#8594;). 注:&nbsp;<code>j</code>&nbsp;就像下箭头。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>:help &lt;command&gt;</code>&nbsp;&#8594; 显示相关命令的帮助。你也可以就输入&nbsp;<code>:help</code>&nbsp;而不跟命令。（陈皓注：退出帮助需要输入:q）</li></ul></blockquote><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">你能在vim幸存下来只需要上述的那5个命令，你就可以编辑文本了，你一定要把这些命令练成一种下意识的状态。于是你就可以开始进阶到第二级了。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">当是，在你进入第二级时，需要再说一下&nbsp;<em>Normal&nbsp;</em>模式。在一般的编辑器下，当你需要copy一段文字的时候，你需要使用&nbsp;<code>Ctrl</code>&nbsp;键，比如：<code>Ctrl-C</code>。也就是说，Ctrl键就好像功能键一样，当你按下了功能键Ctrl后，C就不在是C了，而且就是一个命令或是一个快键键了，<strong>在VIM的Normal模式下，所有的键就是功能键了</strong>。这个你需要知道。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">标记:</p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">下面的文字中，如果是&nbsp;<code>Ctrl-&#955;</code>我会写成&nbsp;<code>&lt;C-&#955;&gt;</code>.</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">以&nbsp;<code>:</code>&nbsp;开始的命令你需要输入&nbsp;<code>&lt;enter&gt;</code>回车，例如 &#8212; 如果我写成&nbsp;<code>:q</code>&nbsp;也就是说你要输入&nbsp;<code>:q&lt;enter&gt;</code>.</li></ul><h4>第二级 &#8211; 感觉良好</h4><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">上面的那些命令只能让你存活下来，现在是时候学习一些更多的命令了，下面是我的建议：（陈皓注：所有的命令都需要在Normal模式下使用，如果你不知道现在在什么样的模式，你就狂按几次ESC键）</p><ol style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><strong>各种插入模式</strong><br /><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>a</code>&nbsp;&#8594; 在光标后插入</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>o</code>&nbsp;&#8594; 在当前行后插入一个新行</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>O</code>&nbsp;&#8594; 在当前行前插入一个新行</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>cw</code>&nbsp;&#8594; 替换从光标所在位置后到一个单词结尾的字符</li></ul></blockquote></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><strong>简单的移动光标</strong><br /><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>0</code>&nbsp;&#8594; 数字零，到行头</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>^</code>&nbsp;&#8594; 到本行第一个不是blank字符的位置（所谓blank字符就是空格，tab，换行，回车等）</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>$</code>&nbsp;&#8594; 到本行行尾</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>g_</code>&nbsp;&#8594; 到本行最后一个不是blank字符的位置。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>/pattern</code>&nbsp;&#8594; 搜索&nbsp;<code>pattern</code>&nbsp;的字符串（陈皓注：如果搜索出多个匹配，可按n键到下一个）</li></ul></blockquote></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><strong>拷贝/粘贴</strong>&nbsp;（陈皓注：p/P都可以，p是表示在当前位置之后，P表示在当前位置之前）<br /><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>P</code>&nbsp;&#8594; 粘贴</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>yy</code>&nbsp;&#8594; 拷贝当前行当行于&nbsp;<code>ddP</code></li></ul></blockquote></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><strong>Undo/Redo</strong><br /><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>u</code>&nbsp;&#8594; undo</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>&lt;C-r&gt;</code>&nbsp;&#8594; redo</li></ul></blockquote></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><strong>打开/保存/退出/改变文件</strong>(Buffer)<br /><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>:e &lt;path/to/file&gt;</code>&nbsp;&#8594; 打开一个文件</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>:w</code>&nbsp;&#8594; 存盘</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>:saveas &lt;path/to/file&gt;</code>&nbsp;&#8594; 另存为&nbsp;<code>&lt;path/to/file&gt;</code></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>:x</code>，&nbsp;<code>ZZ</code>&nbsp;或&nbsp;<code>:wq</code>&nbsp;&#8594; 保存并退出 (<code>:x</code>&nbsp;表示仅在需要时保存，ZZ不需要输入冒号并回车)</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>:q!</code>&nbsp;&#8594; 退出不保存&nbsp;<code>:qa!</code>&nbsp;强行退出所有的正在编辑的文件，就算别的文件有更改。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>:bn</code>&nbsp;和&nbsp;<code>:bp</code>&nbsp;&#8594; 你可以同时打开很多文件，使用这两个命令来切换下一个或上一个文件。（陈皓注：我喜欢使用:n到下一个文件）</li></ul></blockquote></li></ol><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">花点时间熟悉一下上面的命令，一旦你掌握他们了，你就几乎可以干其它编辑器都能干的事了。但是到现在为止，你还是觉得使用vim还是有点笨拙，不过没关系，你可以进阶到第三级了。</p><h4>第三级&nbsp;&#8211; 更好，更强，更快</h4><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">先恭喜你！你干的很不错。我们可以开始一些更为有趣的事了。在第三级，我们只谈那些和vi可以兼容的命令。</p><h5>更好</h5><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">下面，让我们看一下vim是怎么重复自己的：</p><ol style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>.</code>&nbsp;&#8594; (小数点) 可以重复上一次的命令</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">N&lt;command&gt; &#8594; 重复某个命令N次</li></ol><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">下面是一个示例，找开一个文件你可以试试下面的命令：</p><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>2dd</code>&nbsp;&#8594; 删除2行</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>3p</code>&nbsp;&#8594; 粘贴文本3次</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>100idesu [ESC]</code>&nbsp;&#8594; 会写下 &#8220;desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu &#8220;</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>.</code>&nbsp;&#8594; 重复上一个命令&#8212;&#8212; 100 &#8220;desu &#8220;.</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>3.</code>&nbsp;&#8594; 重复 3 次 &#8220;desu&#8221; (注意：不是 300，你看，VIM多聪明啊).</li></ul></blockquote><h5>更强</h5><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">你要让你的光标移动更有效率，你一定要了解下面的这些命令，<strong>千万别跳过</strong>。</p><ol style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">N<code>G</code>&nbsp;&#8594; 到第 N 行 （陈皓注：注意命令中的G是大写的，另我一般使用 : N 到第N行，如 :137 到第137行）</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>gg</code>&nbsp;&#8594; 到第一行。（陈皓注：相当于1G，或 :1）</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>G</code>&nbsp;&#8594; 到最后一行。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">按单词移动：<br /><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ol style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>w</code>&nbsp;&#8594; 到下一个单词的开头。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>e</code>&nbsp;&#8594; 到下一个单词的结尾。</li></ol><p style="margin: 0px 0px 10px; padding: 0px;">&gt; 如果你认为单词是由默认方式，那么就用小写的e和w。默认上来说，一个单词由字母，数字和下划线组成（陈皓注：程序变量）</p><p style="margin: 0px 0px 10px; padding: 0px;">&gt; 如果你认为单词是由blank字符分隔符，那么你需要使用大写的E和W。（陈皓注：程序语句）</p><p style="margin: 0px 0px 10px; padding: 0px;"><img src="http://yannesposito.com/Scratch/img/blog/Learn-Vim-Progressively/word_moves.jpg" alt="Word moves example" style="border: 0px; max-width: 650px;" /></p></blockquote></li></ol><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">下面，让我来说说最强的光标移动：</p><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>%</code>&nbsp;: 匹配括号移动，包括&nbsp;<code>(</code>,&nbsp;<code>{</code>,&nbsp;<code>[</code>. （陈皓注：你需要把光标先移到括号上）</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>*</code>&nbsp;和&nbsp;<code>#</code>: &nbsp;匹配光标当前所在的单词，移动光标到下一个（或上一个）匹配单词（*是下一个，#是上一个）</li></ul></blockquote><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">相信我，上面这三个命令对程序员来说是相当强大的。</p><h5>更快</h5><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">你一定要记住光标的移动，因为很多命令都可以和这些移动光标的命令连动。很多命令都可以如下来干：</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><code>&lt;start position&gt;&lt;command&gt;&lt;end position&gt;</code></p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">例如&nbsp;<code>0y$</code>&nbsp;命令意味着：</p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>0</code>&nbsp;&#8594; 先到行头</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>y</code>&nbsp;&#8594; 从这里开始拷贝</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>$</code>&nbsp;&#8594; 拷贝到本行最后一个字符</li></ul><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">你可可以输入&nbsp;<code>ye</code>，从当前位置拷贝到本单词的最后一个字符。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">你也可以输入&nbsp;<code>y2/foo</code>&nbsp;来拷贝2个 &#8220;foo&#8221; 之间的字符串。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">还有很多时间并不一定你就一定要按y才会拷贝，下面的命令也会被拷贝：</p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>d</code>&nbsp;(删除 )</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>v</code>&nbsp;(可视化的选择)</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>gU</code>&nbsp;(变大写)</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>gu</code>&nbsp;(变小写)</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">等等</li></ul><div style="margin: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">（陈皓注：可视化选择是一个很有意思的命令，你可以先按v，然后移动光标，你就会看到文本被选择，然后，你可能d，也可y，也可以变大写等）</div><h4>第四级 &#8211; Vim 超能力</h4><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">你只需要掌握前面的命令，你就可以很舒服的使用VIM了。但是，现在，我们向你介绍的是VIM杀手级的功能。下面这些功能是我只用vim的原因。</p><h5>在当前行上移动光标:&nbsp;<code>0</code>&nbsp;<code>^</code>&nbsp;<code>$</code>&nbsp;<code>f</code>&nbsp;<code>F</code>&nbsp;<code>t</code>&nbsp;<code>T</code>&nbsp;<code>,</code>&nbsp;<code>;</code></h5><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>0</code>&nbsp;&#8594; 到行头</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>^</code>&nbsp;&#8594; 到本行的第一个非blank字符</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>$</code>&nbsp;&#8594; 到行尾</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>g_</code>&nbsp;&#8594; 到本行最后一个不是blank字符的位置。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>fa</code>&nbsp;&#8594; 到下一个为a的字符处，你也可以fs到下一个为s的字符。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>t,</code>&nbsp;&#8594; 到逗号前的第一个字符。逗号可以变成其它字符。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>3fa</code>&nbsp;&#8594; 在当前行查找第三个出现的a。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>F</code>&nbsp;和&nbsp;<code>T</code>&nbsp;&#8594; 和&nbsp;<code>f</code>&nbsp;和&nbsp;<code>t</code>&nbsp;一样，只不过是相反方向。<br /><img src="http://yannesposito.com/Scratch/img/blog/Learn-Vim-Progressively/line_moves.jpg" alt="Line moves" style="border: 0px; max-width: 650px;" /></li></ul></blockquote><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">还有一个很有用的命令是&nbsp;<code>dt"</code>&nbsp;&#8594; 删除所有的内容，直到遇到双引号&#8212;&#8212;&nbsp;<code>"。</code></p><h5>区域选择&nbsp;<code>&lt;action&gt;a&lt;object&gt;</code>&nbsp;或&nbsp;<code>&lt;action&gt;i&lt;object&gt;</code></h5><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">在visual 模式下，这些命令很强大，其命令格式为</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><code>&lt;action&gt;a&lt;object&gt;</code>&nbsp;和&nbsp;<code>&lt;action&gt;i&lt;object&gt;</code></p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">action可以是任何的命令，如&nbsp;<code>d</code>&nbsp;(删除),&nbsp;<code>y</code>&nbsp;(拷贝),&nbsp;<code>v</code>&nbsp;(可以视模式选择)。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">object 可能是：&nbsp;<code>w</code>&nbsp;一个单词，&nbsp;<code>W</code>&nbsp;一个以空格为分隔的单词，&nbsp;<code>s</code>&nbsp;一个句字，&nbsp;<code>p</code>&nbsp;一个段落。也可以是一个特别的字符：<code>"、</code>&nbsp;<code>'、</code>&nbsp;<code>)、</code>&nbsp;<code>}、</code>&nbsp;<code>]。</code></li></ul><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">假设你有一个字符串&nbsp;<code>(map (+) ("foo"))</code>.而光标键在第一个&nbsp;<code>o&nbsp;</code>的位置。</p><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>vi"</code>&nbsp;&#8594; 会选择&nbsp;<code>foo</code>.</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>va"</code>&nbsp;&#8594; 会选择&nbsp;<code>"foo"</code>.</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>vi)</code>&nbsp;&#8594; 会选择&nbsp;<code>"foo"</code>.</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>va)</code>&nbsp;&#8594; 会选择<code>("foo")</code>.</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>v2i)</code>&nbsp;&#8594; 会选择&nbsp;<code>map (+) ("foo")</code></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>v2a)</code>&nbsp;&#8594; 会选择&nbsp;<code>(map (+) ("foo"))</code></li></ul></blockquote><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><img src="http://yannesposito.com/Scratch/img/blog/Learn-Vim-Progressively/textobjects.png" alt="Text objects selection" style="border: 0px; display: block; margin-left: auto; margin-right: auto; max-width: 650px;" /></p><h5>块操作:&nbsp;<code>&lt;C-v&gt;</code></h5><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">块操作，典型的操作：&nbsp;<code>0 &lt;C-v&gt; &lt;C-d&gt; I-- [ESC]</code></p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>^</code>&nbsp;&#8594; 到行头</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>&lt;C-v&gt;</code>&nbsp;&#8594; 开始块操作</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>&lt;C-d&gt;</code>&nbsp;&#8594; 向下移动 (你也可以使用hjkl来移动光标，或是使用%，或是别的)</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>I-- [ESC]</code>&nbsp;&#8594; I是插入，插入&#8220;<code>--</code>&#8221;，按ESC键来为每一行生效。</li></ul><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><img src="http://yannesposito.com/Scratch/img/blog/Learn-Vim-Progressively/rectangular-blocks.gif" alt="Rectangular blocks" style="border: 0px; display: block; margin-left: auto; margin-right: auto; max-width: 650px;" /></p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">在Windows下的vim，你需要使用&nbsp;<code>&lt;C-q&gt;</code>&nbsp;而不是&nbsp;<code>&lt;C-v&gt;</code>&nbsp;，<code>&lt;C-v&gt;</code>&nbsp;是拷贝剪贴板。</p><h5>自动提示：&nbsp;<code>&lt;C-n&gt;</code>&nbsp;和&nbsp;<code>&lt;C-p&gt;</code></h5><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">在 Insert 模式下，你可以输入一个词的开头，然后按&nbsp;<code>&lt;C-p&gt;或是&lt;C-n&gt;，自动补齐功能就出现了&#8230;&#8230;</code></p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><code></code><img src="http://yannesposito.com/Scratch/img/blog/Learn-Vim-Progressively/completion.gif" alt="Completion" style="border: 0px; display: block; margin-left: auto; margin-right: auto; max-width: 650px;" /></p><h5>宏录制：&nbsp;<code>qa</code>&nbsp;操作序列&nbsp;<code>q</code>,&nbsp;<code>@a</code>,&nbsp;<code>@@</code></h5><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>qa</code>&nbsp;把你的操作记录在寄存器&nbsp;<code>a。</code></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">于是&nbsp;<code>@a</code>&nbsp;会replay被录制的宏。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>@@</code>&nbsp;是一个快捷键用来replay最新录制的宏。</li></ul><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><p style="margin: 0px 0px 10px; padding: 0px;"><strong><em>示例</em></strong></p><p style="margin: 0px 0px 10px; padding: 0px;">在一个只有一行且这一行只有&#8220;1&#8221;的文本中，键入如下命令：</p><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>qaYp&lt;C-a&gt;q</code>&#8594;<ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>qa</code>&nbsp;开始录制</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>Yp</code>&nbsp;复制行.</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>&lt;C-a&gt;</code>&nbsp;增加1.</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>q</code>&nbsp;停止录制.</li></ul></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>@a</code>&nbsp;&#8594; 在1下面写下 2</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>@@</code>&nbsp;&#8594; 在2 正面写下3</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">现在做&nbsp;<code>100@@</code>&nbsp;会创建新的100行，并把数据增加到 103.</li></ul></blockquote><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><img src="http://yannesposito.com/Scratch/img/blog/Learn-Vim-Progressively/macros.gif" alt="Macros" style="border: 0px; display: block; margin-left: auto; margin-right: auto; max-width: 650px;" /></p><h5>可视化选择：&nbsp;<code>v</code>,<code>V</code>,<code>&lt;C-v&gt;</code></h5><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">前面，我们看到了&nbsp;<code>&lt;C-v&gt;</code>的示例 （在Windows下应该是&lt;C-q&gt;），我们可以使用&nbsp;<code>v</code>&nbsp;和&nbsp;<code>V</code>。一但被选好了，你可以做下面的事：</p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>J</code>&nbsp;&#8594; 把所有的行连接起来（变成一行）</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>&lt;</code>&nbsp;或&nbsp;<code>&gt;</code>&nbsp;&#8594; 左右缩进</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>=</code>&nbsp;&#8594; 自动给缩进 （陈皓注：这个功能相当强大，我太喜欢了）</li></ul><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><img src="http://yannesposito.com/Scratch/img/blog/Learn-Vim-Progressively/autoindent.gif" alt="Autoindent" style="border: 0px; display: block; margin-left: auto; margin-right: auto; max-width: 650px;" /></p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">在所有被选择的行后加上点东西：</p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>&lt;C-v&gt;</code></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">选中相关的行 (可使用&nbsp;<code>j</code>&nbsp;或&nbsp;<code>&lt;C-d&gt;</code>&nbsp;或是&nbsp;<code>/pattern</code>&nbsp;或是&nbsp;<code>%</code>&nbsp;等&#8230;&#8230;)</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>$</code>&nbsp;到行最后</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>A</code>, 输入字符串，按&nbsp;<code>ESC。</code></li></ul><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><img src="http://yannesposito.com/Scratch/img/blog/Learn-Vim-Progressively/append-to-many-lines.gif" alt="Append to many lines" style="border: 0px; display: block; margin-left: auto; margin-right: auto; max-width: 650px;" /></p><h5>分屏:&nbsp;<code>:split</code>&nbsp;和&nbsp;<code>vsplit</code>.</h5><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">下面是主要的命令，你可以使用VIM的帮助&nbsp;<code>:help split</code>. 你可以参考本站以前的一篇文章<a title="Vim的分屏功能" href="http://coolshell.cn/articles/1679.html" target="_blank" style="color: #2970a6; text-decoration: none;">VIM分屏</a>。</p><blockquote style="margin: 5px 0px; padding: 8px 12px 8px 36px; background-image: url(http://coolshell.cn/wp-content/themes/inove/img/blockquote.gif); background-color: #f4f5f7; border: 1px dashed #cccccc; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px; background-position: 3px 3px; background-repeat: no-repeat no-repeat;"><ul style="margin: 0px; padding: 0px 0px 10px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>:split</code>&nbsp;&#8594; 创建分屏 (<code>:vsplit</code>创建垂直分屏)</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>&lt;C-w&gt;&lt;dir&gt;</code>&nbsp;: dir就是方向，可以是&nbsp;<code>hjkl</code>&nbsp;或是 &#8592;&#8595;&#8593;&#8594; 中的一个，其用来切换分屏。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>&lt;C-w&gt;_</code>&nbsp;(或&nbsp;<code>&lt;C-w&gt;|</code>)&nbsp;: 最大化尺寸 (&lt;C-w&gt;|&nbsp;垂直分屏)</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><code>&lt;C-w&gt;+</code>&nbsp;(或&nbsp;<code>&lt;C-w&gt;-</code>)&nbsp;: 增加尺寸</li></ul></blockquote><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><img src="http://yannesposito.com/Scratch/img/blog/Learn-Vim-Progressively/split.gif" alt="Split" style="border: 0px; display: block; margin-left: auto; margin-right: auto; max-width: 650px;" /></p><h4>结束语</h4><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">上面是作者最常用的90%的命令。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">我建议你每天都学1到2个新的命令。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">在两到三周后，你会感到vim的强大的。</li></ul><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">有时候，学习VIM就像是在死背一些东西。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">幸运的是，vim有很多很不错的工具和优秀的文档。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">运行vimtutor直到你熟悉了那些基本命令。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">其在线帮助文档中你应该要仔细阅读的是&nbsp;<code>:help usr_02.txt</code>.</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">你会学习到诸如&nbsp;&nbsp;<code>!，</code>&nbsp;目录，寄存器，插件等很多其它的功能。</li></ul><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">学习vim就像学弹钢琴一样，一旦学会，受益无穷。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;正文结束&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">对于vi/vim只是点评一点：这是一个你不需要使用鼠标，不需使用小键盘，只需要使用大键盘就可以完成很多复杂功能文本编辑的编辑器。不然，<a title="Visual Studio的Vim插件" href="http://coolshell.cn/articles/1901.html" target="_blank" style="color: #2970a6; text-decoration: none;">Visual Studio也不就会有vim的插件了</a>。</p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">(全文完)<br /><br />本文转自：<a href="http://coolshell.cn/articles/5426.html" style="font-family: verdana, 'courier new'; line-height: 21px;">http://coolshell.cn/articles/5426.html</a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/204486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-11-28 10:56 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何调试makefile变量</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204485.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 28 Nov 2013 02:46:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204485.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/204485.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/204485.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/204485.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">对于Makefile中的各种变量，可能是我们比较头痛的事了。我们要查看他们并不是很方便，需要修改makefile加入echo命令。这有时候很不方便。其实我们可以制作下面一个专门用来输出变量的makefile（假设名字叫：vars.mk）<br /><br /><span style="color: #000000; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; line-height: 15.390625px; background-color: #ffffff;">vars.mk<br /></span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #000000; ">%:</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">@echo</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">$*=$($*)</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; ">d</span><span style="color: #000000; ">-%:</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">@echo</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">$*=$($*)</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">@echo</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">&nbsp;&nbsp;origin&nbsp;=&nbsp;$(origin&nbsp;$*)</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">@echo</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;$(value&nbsp;&nbsp;$*)</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">@echo</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">&nbsp;&nbsp;flavor&nbsp;=&nbsp;$(flavor&nbsp;$*)</span><span style="color: #000000; font-weight: bold; ">'</span></div><p>&nbsp;<span style="color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">这样一来，我们可以使用make命令的-f参数来查看makefile中的相关变量（包括make的内建变量，比如：COMPILE.c或MAKE_VERSION之类的）。</span><strong style="color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">注意：第二个以&#8220;d-&#8221;为前缀的目标可以用来打印关于这个变量更为详细的东西</strong><span style="color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">（后面有详细说明）</span></p><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">假设我们的makefile是这个样子（test.mk）<br /><br /><span style="color: #000000; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; line-height: 15.390625px; background-color: #ffffff;">test.mk</span><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">OBJDIR&nbsp;</span><span style="color: #000000; ">:=</span><span style="color: #000000; ">&nbsp;objdir<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">OBJS&nbsp;</span><span style="color: #000000; ">:=</span><span style="color: #000000; ">&nbsp;$(addprefix&nbsp;$(OBJDIR)</span><span style="color: #000000; ">/,</span><span style="color: #000000; ">foo</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o&nbsp;bar</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o&nbsp;baz</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o)<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">foo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;$(bar)bar&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;$(ugh)ugh&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Huh</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">CFLAGS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;$(include_dirs)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">include_dirs&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Ifoo&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Ibar<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">CFLAGS&nbsp;</span><span style="color: #000000; ">:=</span><span style="color: #000000; ">&nbsp;$(CFLAGS)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Wall<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">MYOBJ&nbsp;</span><span style="color: #000000; ">:=</span><span style="color: #000000; ">&nbsp;a</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o&nbsp;b</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o&nbsp;c</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">MYSRC&nbsp;</span><span style="color: #000000; ">:=</span><span style="color: #000000; ">&nbsp;$(MYOBJ</span><span style="color: #000000; ">:.</span><span style="color: #000000; ">o</span><span style="color: #000000; ">=.</span><span style="color: #000000; ">c)</span></div><p>&nbsp;<span style="color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">那么，我们可以这样进行调试：</span></p><div style="margin: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><br /><span style="color: #000000; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; line-height: 15.390625px; background-color: #ffffff;">演示<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">[hchen</span><span style="color: #800080; ">@RHELSVR5</span><span style="color: #000000; ">]$&nbsp;</span><span style="color: red;">make&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;</span><span style="color: red;">test</span><span style="color: red;">.</span><span style="color: red;">mk&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;var</span><span style="color: #000000; ">.</span><span style="color: #000000; ">mk&nbsp;OBJS<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">OBJS</span><span style="color: #000000; ">=</span><span style="color: #000000; ">objdir</span><span style="color: #000000; ">/</span><span style="color: #000000; ">foo</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o&nbsp;objdir</span><span style="color: #000000; ">/</span><span style="color: #000000; ">bar</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o&nbsp;objdir</span><span style="color: #000000; ">/</span><span style="color: #000000; ">baz</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;</span>&nbsp; &nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">[hchen</span><span style="color: #800080; ">@RHELSVR5</span><span style="color: #000000; ">]$&nbsp;</span><span style="color: red;">make&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;</span><span style="color: red;">test</span><span style="color: red;">.</span><span style="color: red;">mk&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;var</span><span style="color: #000000; ">.</span><span style="color: #000000; ">mk&nbsp;d</span><span style="color: #000000; ">-</span><span style="color: #000000; ">foo<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">foo</span><span style="color: #000000; ">=</span><span style="color: #000000; ">Huh</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;origin&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: red;">file</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;$(bar)<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;flavor&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recursive<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">[hchen</span><span style="color: #800080; ">@RHELSVR5</span><span style="color: #000000; ">]$&nbsp;</span><span style="color: red;">make&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;</span><span style="color: red;">test</span><span style="color: red;">.</span><span style="color: red;">mk&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;var</span><span style="color: #000000; ">.</span><span style="color: #000000; ">mk&nbsp;d</span><span style="color: #000000; ">-</span><span style="color: #000000; ">CFLAGS<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">CFLAGS</span><span style="color: #000000; ">=-</span><span style="color: #000000; ">Ifoo&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Ibar&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;origin&nbsp;</span><span style="color: #000000; ">=</span><span style="color: red;">&nbsp;file</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Ifoo&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Ibar&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;flavor&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;simple<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">[hchen</span><span style="color: #800080; ">@RHELSVR5</span><span style="color: #000000; ">]$&nbsp;&nbsp;make&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;test</span><span style="color: #000000; ">.</span><span style="color: #000000; ">mk&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;var</span><span style="color: #000000; ">.</span><span style="color: #000000; ">mk&nbsp;d</span><span style="color: #000000; ">-</span><span style="color: #000000; ">COMPILE</span><span style="color: #000000; ">.</span><span style="color: #000000; ">c<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">COMPILE</span><span style="color: #000000; ">.</span><span style="color: #000000; ">c</span><span style="color: #000000; ">=</span><span style="color: #000000; ">cc&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Ifoo&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Ibar&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Wall&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">c<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;origin&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;default<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;flavor&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recursive<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;$(CC)&nbsp;$(CFLAGS)&nbsp;$(CPPFLAGS)&nbsp;$(TARGET_ARCH)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">c</span></div></div><div style="margin: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><br />我们可以看到：</div><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">make的第一个-f后是要测试的makefile，第二个是我们的debug makefile。</li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;">后面直接跟变量名，如果在变量名前加&#8221;d-&#8221;，则输出更为详细的东西。</li></ul><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">说一说&#8221;d-&#8221; 前缀（其意为details），其中调用了下面三个参数。</p><ul style="margin: 0px; padding: 0px 0px 10px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;"><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-family: 'Courier New';"><a href="http://www.gnu.org/software/make/manual/make.html#Origin-Function" style="color: #2970a6; text-decoration: none;">$(origin)</a>：告诉你这个变量是来自哪儿，file表示文件，environment表示环境变量，还有environment override，command line，override，automatic等。</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-family: 'Courier New';"><a href="http://www.gnu.org/software/make/manual/make.html#Value-Function" style="color: #2970a6; text-decoration: none;">$(value)</a>：打出这个变量没有被展开的样子。比如上述示例中的 foo 变量。</span></li><li style="margin: 0px; padding: 0px 0px 0px 20px; list-style-position: inside;"><span style="font-family: 'Courier New';"><a href="http://www.gnu.org/software/make/manual/make.html#Flavor-Function" style="color: #2970a6; text-decoration: none;">$(flavor)</a>：有两个值，simple表示是一般展开的变量，recursive表示递归展开的变量。</span></li></ul><p style="margin: 0px 0px 10px; padding: 0px; color: #555555; font-family: Arial, Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; line-height: 22px;">（全文完）<br /><br />本文转自：<a href="http://coolshell.cn/articles/3790.html#more-3790" style="font-family: verdana, 'courier new'; line-height: 21px;">http://coolshell.cn/articles/3790.html#more-3790</a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/204485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-11-28 10:46 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/11/28/204485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux中断与异常（转载）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/10/22/203863.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Tue, 22 Oct 2013 00:32:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/10/22/203863.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/203863.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/10/22/203863.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/203863.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/203863.html</trackback:ping><description><![CDATA[<h2><a id="cb_post_title_url" href="http://www.cnblogs.com/chengxuyuancc/p/3380922.html" style="color: #223355; text-decoration: none;"><br /></a><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>　看了《深入理解linux内核》的中断与异常，简单总结了下，如果有错误，望指正！</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>一 什么是中断和异常</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　异常又叫同步中断，是当指令执行时由cpu控制单元产生的，之所以称之为异常，是因为只有在一条指令结束之后才发出中断（程序执行异常或者系统调用）。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　中断又叫异步中断，是由其他硬件设备依照cpu时钟信号随机产生的。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>二 高级可编程中断控制器</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; text-align: center; margin-top: 10px !important; margin-bottom: 10px !important;"><img src="http://images.cnitblog.com/blog/407509/201310/21152018-d5ba3d615eee4296be910c7968265727.jpg" alt="" width="479" height="309" style="border: 0px;" /></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; text-align: center; margin-top: 10px !important; margin-bottom: 10px !important;">APIC</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　每个CPU都有一个本地的APIC，通过IIC bus链接到一个I/O APIC，这个I/O APIC负责处理外部IRQS，分发IRQS给本地APIC。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>三 中断与异常处理程序嵌套执行</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　中断处理程序允许被另一个中断处理程序&#8221;中断&#8220;，从而引起内核控制路径嵌套执行。<span style="color: #ff0000;">但是中断处理程序是不允许发生阻塞，即任务切换的</span>。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　中断可以抢占异常处理程序，但异常处理程序不会抢占中断。因为中断处理程序必定处于内核态，如果发生异常，那只能是BUG了，也就是说内核控制路径中异常处理程序不会超过一个。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>四 Linux中断描述符</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　Intel把中断描述符分三类：任务门、中断门、陷阱门，而Linux则分成五类：</p><ol style="padding-left: 50px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff;"><li style="list-style-type: decimal; text-align: left;">中断门：Intel的中断门，DPL = 0，描述中断处理程序，通过set_intr_gate宏设置</li><li style="list-style-type: decimal; text-align: left;">系统门：Intel的陷阱门，DPL = 3，用于系统调用，通过set_system_gate宏设置</li><li style="list-style-type: decimal; text-align: left;">系统中断门：Intel的中断门，DPL = 3，用于向量3的异常处理，通过set_system_intr_gate宏设置</li><li style="list-style-type: decimal; text-align: left;">陷阱门：Intel陷阱门，DPL = 0，大部分的异常处理，通过set_trap_gate宏设置</li><li style="list-style-type: decimal; text-align: left;">任务门：Intel任务门，DPL = 0，对&#8221;Double fault&#8220;异常处理，通过set_task_gate宏设置</li></ol><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>五 异常处理</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　当cpu产生异常时，会自动根据产生的异常编号在IDT中找对应的异常处理程序，异常处理程序保存大多数寄存器的值，调用异常处理的高级C函数处理该异常，然后通过调用ret_from_exception从异常处理程序退出。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>六 中断处理</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　I/O中断处理程序执行的四个基本过程：</p><ol style="padding-left: 50px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff;"><li style="list-style-type: decimal;">在内核态堆栈中保存IRQ的值和寄存器的内容</li><li style="list-style-type: decimal;">给正在为IRQ线服务的PIC发送一个应答，这将允许该PIC进一步发中断</li><li style="list-style-type: decimal;">执行共享该IRQ的所有设备的中断服务例程（ISR）</li></ol><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>七 IRQ数据结构</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><img src="http://images.cnitblog.com/blog/407509/201310/21153644-8982effaf1e942c492e101f1fb0ff1ff.jpg" alt="" width="653" height="295" style="border: 0px; display: block; margin-left: auto; margin-right: auto;" /></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; text-align: center; margin-top: 10px !important; margin-bottom: 10px !important;">IRQ数据结构</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　hw_irq_controller是对PIC进程控制的一些函数，包括应答PIC什么的。action指向的是一个irqaction链，每个irqaction描述一个设备的服务例程。irq_desc_t中的state字段保证了同一时刻只有一个设备会拥有该IRQ，正在处理该IRQ的CPU会禁用这条IRQ（本地），其它cpu还是可以接受该IRQ的请求，不过由于此时state的状态为IRQ_INPROGRESS，所以新的IRQ请求会在其它的CPU上应答，但不会处理，也就是该新的IRQ处理会被延迟到处理同一个IRQ的前面一个CPU上执行。<span style="color: #ff0000;">能这样做是因为IRQ的数据结构是所有CPU所共享的</span>。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>八 多种类型的内核栈</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　如果编译内核设置内核栈为8k，那么进程的内核栈被用于所有类型的内核控制路径。如果内核栈为4k，则内核使用3种类型的内核栈：异常栈，用于处理异常，<span style="color: #ff0000;">每个进程一个</span>；硬中断栈，用于处理中断，<span style="color: #ff0000;">每个cpu一个</span>；软中断栈，用于出来延迟函数，<span style="color: #ff0000;">每个cpu一个</span>。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>九 软中断</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>1 为什么要引进软中断机制，用前面的中断机制不就可以了吗（老版本的linux就没有软中断机制）？</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　从前面的中断处理中可以看出，一个中断处理程序的几个中断服务例程（每个设备一个）是串行执行的，如果某个处理例程执行的时间比较长，而后面的例程又很紧急，那么会导致这个紧急的例程汇编延迟比较久的时间。所以如果能把一些服务例程中不是很紧急但又花费比较长的操作延迟到执行完该IRQ上所有中断服务例程之后执行，那么一些紧急的，花费时间短（一般紧急的操作所需的时间都是比较短的）的例程就可以得到快速的响应。还有就是对于某个设备的中断服务例程，如果它的服务例程服务时间过长，cpu在执行该服务例程时是会中断本地cpu对该设备的中断或者整个本地中断，这样会导致很多中断会得不到快速的响应。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>2 软中断使用的关键数据结构</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　softirq_vec数组，每个数组元素类型为softirq_action，该数组总共有32个元素，目前只用了前面六个。softirq_action数据结构包含两个字段：指向软中断处理函数的action指针和指向软中断函数需要的通用数据结构的data指针，<span style="color: #ff0000;">这是cpu共享的</span>。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　每个进程描述的thread_info字段中的preempt_count字段，该字段被编码来表示三个不同的计数器和一个标志。0-7位表示是否允许抢占内核，8-15表示是否正在处理软中断，16-27表示硬件中断控制路径嵌套数，28为是PREEMPT_ACTIVE标志。<span style="color: #ff0000;">每个进程有一个</span>。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　另一个是每个cpu都有的32位掩码，存放在irq_cpustat_t数据结构中的__softirq_pending字段，32位，每一位表示softirq_vec数组中的对应的软中断函数是否已激活。irq_cpustat_t存放在irq_stat数组中，每个cpu对于数组中的一个irq_cpustat_t。<span style="color: #ff0000;">每个cpu一个</span>。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>3 软中断可延迟函数的四个操作</strong></p><ul style="margin-left: 45px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff;"><li style="list-style: inherit !important; text-align: left;">初始化，定义一个新的可延迟函数，并加入到softirq_vec数组中，<span style="color: #ff0000;">所有cpu共享该softirq_vec</span>。</li><li style="list-style: inherit !important; text-align: left;">激活，标记一个可延迟函数为&#8221;挂起&#8220;，通过前面描述的__softirq_pending字段。</li><li style="list-style: inherit !important; text-align: left;">屏蔽，有选择地屏蔽一个可延迟函数，即使它被激活。它是通过前面的preempt_count字段或者关闭本地中断（延迟函数一般是通过中断处理程序激活的，如果没有中断处理程序执行，自然也就不会有延迟函数的激活）来实现的。</li><li style="list-style: inherit !important; text-align: left;">执行，执行一个挂起的可延迟函数和同类型的其它挂起的可延迟函数。通过do_softirq实现。</li></ul><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　<span style="color: #ff0000;">激活和执行可延迟函数必须要在同一个cpu上，从前面激活和执行可以看出这一点。因为__softirq_pending是每个cpu一个，所有在特定cpu激活的延迟函数，只有在该cpu上的__softirq_pending标记激活，而其它cpu是不知道该函数被激活的，也就不会去执行该函数了</span>。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>4 linux现有的六种软中断</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　处理高级优先级的tasklet软中断HI_SOFTIRQ，在softirq_vec数组的下标为0；和时钟中断关联的tasklet软中断TIMER_SOFTIRQ，在softirq_vec数组的下标为1；把数据包传送到网卡软中断NET_TX_SOFTIRQ，在softirq_vec数组的下标为2；从网卡接收数据包的软中断NET_RX_SOFTIRQ，在softirq_vec数组的下标为3；SCSI命令的后天中断处理的软中断SCSI_SOFTIRQ，在softirq_vec数组的下标为4；处理常规tasklet软中断TASKLET_SOFTIRQ，在softirq_vec数组的下标为5；它们的优先级是从高到低的。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>5 检查是否有软中断挂起（也叫激活）的时机</strong></p><ul style="margin-left: 45px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff;"><li style="list-style: inherit !important; text-align: left;">内核调用local_bh_enable激活本地软中断</li><li style="list-style: inherit !important; text-align: left;">smp_apic_timer_interrupt处理完本地定时中断</li><li style="list-style: inherit !important; text-align: left;">cpu处理CALL_FUNCTION_VECTOR中断处理</li><li style="list-style: inherit !important; text-align: left;">当一个特殊的ksoftirq/n内核线程被唤醒。</li></ul><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　ksoftirq/n内核线程是专门用来处理激活的软中断的，<span style="color: #ff0000;">每个cpu有一个</span>。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>十 tasklet</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　tasklet是在软中断的基础上实现的。正如前面说的linux现有的六种软中断，其中HI_SOFTIRQ和TASKLET_SOFTIRQ软中断就是tasklet。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　<span style="color: #ff0000;">对于每种tasklet（HI_SOFTIRQ和TASKLET_SOFTIRQ），每个cpu都有一个tasklet_head类型来描述这种tasklet。tasklet_head类型指向了一个由tasklet类型组成的链表，而每个tasklet类型描述了该tasklet要执行的函数和函数需要的数据以及tasklet的状态（状态表示同类型的tasklet是否在运行等）。</span></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　当do_softirq处理软中断时，如果相应的HI_SOFTIRQ和TASKLET_SOFTIRQ软中断被激活，就会调用对应的软中断函数tasklet_hi_action和tasklet_action。而这两个函数处理的数据正是HI_SOFTIRQ和TASKLET_SOFTIRQ类型tasklet所对应的tasklet_head类型指向的tasklett链表。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　为了能够写自己的tasklet函数并加入到对应tasklet类型的tasklet_head指向的链表中，需要调用tasklet_init来初始化新的tasklet和调用tasklet_schedule或tasklet_hi_schedule来把我们自定义的tasklet加入到对应的tasklet_head指向的链表中并激活该tasklet类型所对应的软中断。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　所以说tasklet是在软中断的基础上实现的，但不同的是软中断时静态分配的（linux分配了6个软中断），而tasklet是可以动态加入和删除tasklet的。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>十一 工作队列</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　<span style="color: #ff0000;">每个工作队列，在每个cpu上都有一个cpu_workqueue_struct结构来描述，即对于同一个工作队列，每个cpu都有该队列的一个拷贝</span>。cpu_workqueue_struct中的worklist成员指向了由work_struct结构组成的链表，这个链表描述的是该工作队列被挂起的函数，等待工作者线程去执行。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　通过调用create_workqueue创建工作队列。如果是smp，则每个cpu都会创建一个工作队列和为该工作队列工作的工作者线程。该工作者线程一直阻塞，直到有函数被加入到工作队列中去，工作者线程执行了函数之后就把函数从工作队列中删除。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　可以通过queue_work函数把一个函数加入到工作队列中去。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　由于仅仅为了一个函数就创建一个工作队列开销太大，所以内核预定义了一个叫events的工作队列，为该队列工作的工作者线程叫events/n，每个cpu一个。还有就是专门为块设备使用的kblocked工作队列。</p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;"><strong>十二 软中断与工作队列的区别</strong></p><p style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; line-height: 25px; background-color: #ffffff; margin-top: 10px !important; margin-bottom: 10px !important;">　　从上面可以看出，软中断和工作队列十分的相似，都是对服务例程中某些耗时的操延后处理。主要区别在于，软中断的可延迟函数是在中断上下文中执行的，而工作者队列的函数则是在进程上下文中执行的，也就是说软中断的延迟函数执行期间不允许内核被抢占，而工作队列则是可以的。<br /><br />本文转自：<a href="http://www.cnblogs.com/chengxuyuancc/p/3380922.html" style="font-family: verdana, 'courier new'; line-height: 21px;">http://www.cnblogs.com/chengxuyuancc/p/3380922.html</a></p><a id="cb_post_title_url" href="http://www.cnblogs.com/chengxuyuancc/p/3380922.html"></a></h2><img src ="http://www.cppblog.com/wanghaiguang/aggbug/203863.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-10-22 08:32 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/10/22/203863.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux程序调试（转载）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/07/31/202259.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Wed, 31 Jul 2013 04:07:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/07/31/202259.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/202259.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/07/31/202259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/202259.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/202259.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">Linux下的段错误产生的原因及调试方法</span><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;原文地址：<a href="http://www.upsdn.net/html/2006-11/775.html" style="color: #444444; text-decoration: none;">http://www.upsdn.net/html/2006-11/775.html</a>&nbsp;<br />&nbsp;&nbsp;&nbsp;参考地址：<a href="http://www.cnblogs.com/khler/archive/2010/09/16/1828349.html" style="color: #444444; text-decoration: none;">http://www.cnblogs.com/khler/archive/2010/09/16/1828349.html</a>&nbsp;</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">简而言之,产生段错误就是访问了错误的内存段，一般是你没有权限，或者根本就不存在对应的物理内存,尤其常见的是访问0地址.<br /><br />一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间，通常这个值是由gdtr来保存的，他是一个48位的寄存器，其中的32位是保存由它指向的gdt表，后13位保存相应于gdt的下标，最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表，在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了越界访问，cpu就会产生相应的异常保护，于是segmentation fault就出现了.<br /><br />在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的<br /><br />1)访问系统数据区，尤其是往&nbsp; 系统保护的内存地址写数据<br />&nbsp;&nbsp; 最常见就是给一个指针以0地址<br />2)内存越界(数组越界，变量类型不一致等) 访问到不属于你的内存区域<br /><br />解决方法<br /><br />我们在用C/C++语言写程序的时侯，内存管理的绝大部分工作都是需要我们来做的。实际上，内存管理是一个比较繁琐的工作，无论你多高明，经验多丰富，难 免会在此处犯些小错误，而通常这些错误又是那么的浅显而易于消除。但是手工&#8220;除虫&#8221;（debug），往往是效率低下且让人厌烦的，本文将就"段错误"这个 内存访问越界的错误谈谈如何快速定位这些"段错误"的语句。<br />下面将就以下的一个存在段错误的程序介绍几种调试方法：<br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; dummy_function (void)<br />&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char *ptr = 0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ptr = 0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; 6<br />&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp; int main (void)<br />&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dummy_function ();<br />&nbsp;&nbsp;&nbsp; 10<br />&nbsp;&nbsp;&nbsp; 11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />&nbsp;&nbsp;&nbsp; 12&nbsp; }<br /></td></tr></tbody></table>作为一个熟练的C/C++程序员，以上代码的bug应该是很清楚的，因为它尝试操作地址为0的内存区域，而这个内存区域通常是不可访问的禁区，当然就会出错了。我们尝试编译运行它:<br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>xiaosuo@gentux test $ ./a.out<br />段错误<br /></td></tr></tbody></table>果然不出所料，它出错并退出了。<br /><span style="font-weight: bold;">1.利用gdb逐步查找段错误:</span><br />这种方法也是被大众所熟知并广泛采用的方法，首先我们需要一个带有调试信息的可执行程序，所以我们加上&#8220;-g -rdynamic"的参数进行编译，然后用gdb调试运行这个新编译的程序,具体步骤如下:<br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>xiaosuo@gentux test $ gcc -g -rdynamic d.c<br />xiaosuo@gentux test $ gdb ./a.out<br />GNU gdb 6.5<br />Copyright (C) 2006 Free Software Foundation, Inc.<br />GDB is free software, covered by the GNU General Public License, and you are<br />welcome to change it and/or distribute copies of it under certain conditions.<br />Type "show copying" to see the conditions.<br />There is absolutely no warranty for GDB.&nbsp; Type "show warranty" for details.<br />This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".<br /><br />(gdb) r<br />Starting program: /home/xiaosuo/test/a.out<br /><br />Program received signal SIGSEGV, Segmentation fault.<br />0x08048524 in dummy_function () at d.c:4<br />4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ptr = 0x00;<br />(gdb)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></td></tr></tbody></table>哦？！好像不用一步步调试我们就找到了出错位置d.c文件的第4行，其实就是如此的简单。<br />从这里我们还发现进程是由于收到了SIGSEGV信号而结束的。通过进一步的查阅文档(man 7 signal)，我们知道SIGSEGV默认handler的动作是打印&#8221;段错误"的出错信息，并产生Core文件，由此我们又产生了方法二。<br /><span style="font-weight: bold;">2.分析Core文件：</span><br />Core文件是什么呢？<br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>The&nbsp; default action of certain signals is to cause a process to terminate and produce a core dump file, a disk file containing an image of the process's memory&nbsp; at the time of termination.&nbsp; A list of the signals which cause a process to dump core can be found in signal(7).</td></tr></tbody></table>以 上资料摘自man page(man 5 core)。不过奇怪了，我的系统上并没有找到core文件。后来，忆起为了渐少系统上的拉圾文件的数量（本人有些洁癖，这也是我喜欢Gentoo的原因 之一），禁止了core文件的生成，查看了以下果真如此，将系统的core文件的大小限制在512K大小，再试:<br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>xiaosuo@gentux test $ ulimit -c<br />0<br />xiaosuo@gentux test $ ulimit -c 1000<br />xiaosuo@gentux test $ ulimit -c<br />1000<br />xiaosuo@gentux test $ ./a.out<br />段错误 (core dumped)<br />xiaosuo@gentux test $ ls<br />a.out&nbsp; core&nbsp; d.c&nbsp; f.c&nbsp; g.c&nbsp; pango.c&nbsp; test_iconv.c&nbsp; test_regex.c<br /></td></tr></tbody></table>core文件终于产生了，用gdb调试一下看看吧:<br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>xiaosuo@gentux test $ gdb ./a.out core<br />GNU gdb 6.5<br />Copyright (C) 2006 Free Software Foundation, Inc.<br />GDB is free software, covered by the GNU General Public License, and you are<br />welcome to change it and/or distribute copies of it under certain conditions.<br />Type "show copying" to see the conditions.<br />There is absolutely no warranty for GDB.&nbsp; Type "show warranty" for details.<br />This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".<br /><br /><br />warning: Can't read pathname for load map: 输入/输出错误.<br />Reading symbols from /lib/libc.so.6...done.<br />Loaded symbols for /lib/libc.so.6<br />Reading symbols from /lib/ld-linux.so.2...done.<br />Loaded symbols for /lib/ld-linux.so.2<br />Core was generated by `./a.out'.<br />Program terminated with signal 11, Segmentation fault.<br />#0&nbsp; 0x08048524 in dummy_function () at d.c:4<br />4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ptr = 0x00;<br /></td></tr></tbody></table>哇，好历害，还是一步就定位到了错误所在地，佩服一下Linux/Unix系统的此类设计。<br />接着考虑下去，以前用windows系统下的ie的时侯，有时打开某些网页，会出现&#8220;运行时错误&#8221;，这个时侯如果恰好你的机器上又装有windows的编译器的话，他会弹出来一个对话框，问你是否进行调试，如果你选择是，编译器将被打开，并进入调试状态，开始调试。<br />Linux下如何做到这些呢？我的大脑飞速地旋转着，有了，让它在SIGSEGV的handler中调用gdb，于是第三个方法又诞生了:<br /><span style="font-weight: bold;">3.段错误时启动调试:</span><br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;signal.h&gt;<br />#include &lt;string.h&gt;<br /><br />void dump(int signo)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char buf[1024];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char cmd[1024];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE *fh;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!(fh = fopen(buf, "r")))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!fgets(buf, sizeof(buf), fh))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fclose(fh);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(buf[strlen(buf) - 1] == '\n')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buf[strlen(buf) - 1] = '\0';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; snprintf(cmd, sizeof(cmd), "gdb %s %d", buf, getpid());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; system(cmd);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(0);<br />}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void<br />dummy_function (void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char *ptr = 0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ptr = 0x00;<br />}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int<br />main (void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signal(SIGSEGV, &amp;dump);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dummy_function ();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />}<br /></td></tr></tbody></table>编译运行效果如下:<br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>xiaosuo@gentux test $ gcc -g -rdynamic f.c<br />xiaosuo@gentux test $ ./a.out<br />GNU gdb 6.5<br />Copyright (C) 2006 Free Software Foundation, Inc.<br />GDB is free software, covered by the GNU General Public License, and you are<br />welcome to change it and/or distribute copies of it under certain conditions.<br />Type "show copying" to see the conditions.<br />There is absolutely no warranty for GDB.&nbsp; Type "show warranty" for details.<br />This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".<br /><br />Attaching to program: /home/xiaosuo/test/a.out, process 9563<br />Reading symbols from /lib/libc.so.6...done.<br />Loaded symbols for /lib/libc.so.6<br />Reading symbols from /lib/ld-linux.so.2...done.<br />Loaded symbols for /lib/ld-linux.so.2<br />0xffffe410 in __kernel_vsyscall ()<br />(gdb) bt<br />#0&nbsp; 0xffffe410 in __kernel_vsyscall ()<br />#1&nbsp; 0xb7ee4b53 in waitpid () from /lib/libc.so.6<br />#2&nbsp; 0xb7e925c9 in strtold_l () from /lib/libc.so.6<br />#3&nbsp; 0x08048830 in dump (signo=11) at f.c:22<br />#4&nbsp; &lt;signal handler called&gt;<br />#5&nbsp; 0x0804884c in dummy_function () at f.c:31<br />#6&nbsp; 0x08048886 in main () at f.c:38<br /></td></tr></tbody></table>怎么样？是不是依旧很酷？<br />以上方法都是在系统上有gdb的前提下进行的，如果没有呢？其实glibc为我们提供了此类能够dump栈内容的函数簇，详见/usr/include/execinfo.h（这些函数都没有提供man page，难怪我们找不到），另外你也可以通过<a href="http://www.gnu.org/software/libc/manual/html_node/Backtraces.html" target="_blank" style="color: #444444; text-decoration: none;"><strong>gnu的手册</strong></a>进行学习。<br /><span style="font-weight: bold;">4.利用backtrace和objdump进行分析:</span><br />重写的代码如下:<br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>#include &lt;execinfo.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;signal.h&gt;<br /><br />/* A dummy function to make the backtrace more interesting. */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void<br />dummy_function (void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char *ptr = 0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ptr = 0x00;<br />}<br /><br />void dump(int signo)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void *array[10];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t size;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char **strings;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t i;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size = backtrace (array, 10);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strings = backtrace_symbols (array, size);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf ("Obtained %zd stack frames.\n", size);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; size; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf ("%s\n", strings[i]);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free (strings);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(0);<br />}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int<br />main (void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signal(SIGSEGV, &amp;dump);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dummy_function ();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />}<br /></td></tr></tbody></table>编译运行结果如下：<br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>xiaosuo@gentux test $ gcc -g -rdynamic g.c<br />xiaosuo@gentux test $ ./a.out<br />Obtained 5 stack frames.<br />./a.out(dump+0x19) [0x80486c2]<br />[0xffffe420]<br />./a.out(main+0x35) [0x804876f]<br />/lib/libc.so.6(__libc_start_main+0xe6) [0xb7e02866]<br />./a.out [0x8048601]<br /></td></tr></tbody></table>这次你可能有些失望,似乎没能给出足够的信息来标示错误,不急,先看看能分析出来什么吧,用objdump反汇编程序,找到地址0x804876f对应的代码位置:<br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>xiaosuo@gentux test $ objdump -d a.out<br /></td></tr></tbody></table><br /><table align="center" style="border-style: solid; border-color: #999999; width: 932px; font-size: 12px;"><tbody><tr><td>&nbsp;8048765:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e8 02 fe ff ff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; 804856c &lt;signal@plt&gt;<br />&nbsp;804876a:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e8 25 ff ff ff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; 8048694 &lt;dummy_function&gt;<br />&nbsp;<span style="color: #ff0102;">804876f</span>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b8 00 00 00 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; $0x0,%eax<br />&nbsp;8048774:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leave<br /></td></tr></tbody></table>我们还是找到了在哪个函数(dummy_function)中出错的,信息已然不是很完整,不过有总比没有好的啊!<br /><span style="font-weight: bold;">后记:</span><br />本文给出了分析"段错误"的几种方法,不要认为这是与孔乙己先生的"回"字四种写法一样的哦,因为每种方法都有其自身的适用范围和适用环境,请酌情使用,或遵医嘱。<br /><br />部分资料来源于xiaosuo @ cnblog.cn, 特此致谢</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">作者:upsdn整理 &nbsp; 更新日期:2006-11-03<br />来源:upsdn.net &nbsp; 浏览次数:&nbsp;<br /><br /><br /><br /><strong>其它调试办法</strong></p><ul style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;"><li><strong>添加日志&nbsp;</strong></li></ul><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Linux上的使用开源C++日志库---log4cplus<strong>&nbsp;</strong></p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;"><br /><br /><strong>linux下追踪函数调用堆栈<br /></strong><br />一般察看函数运行时堆栈的方法是使用GDB之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的。</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;Function: int backtrace(void **buffer,int size)</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;该函数用与获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针列表。参数&nbsp;size&nbsp;用来指定buffer中可以保存多少个void*&nbsp;元素。函数返回值是实际获取的指针个数,最大不超过size大小</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;在buffer中的指针实际是从堆栈中获取的返回地址,每一个堆栈框架有一个返回地址</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;注意某些编译器的优化选项对获取正确的调用堆栈有干扰,另外内联函数没有堆栈框架;删除框架指针也会使无法正确解析堆栈内容</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;Function: char ** backtrace_symbols (void *const *buffer, int size)</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;backtrace_symbols将从backtrace函数获取的信息转化为一个字符串数组.&nbsp;参数buffer应该是从backtrace函数获取的数组指针,size是该数组中的元素个数(backtrace的返回值)</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;函数返回值是一个指向字符串数组的指针,它的大小同buffer相同.每个字符串包含了一个相对于buffer中对应元素的可打印信息.它包括函数名，函数的偏移地址,和实际的返回地址</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;现在,只有使用ELF二进制格式的程序和苦衷才能获取函数名称和偏移地址.在其他系统,只有16进制的返回地址能被获取.另外,你可能需要传递相应的标志给链接器,以能支持函数名功能(比如,在使用GNU ld的系统中,你需要传递(-rdynamic))</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;该函数的返回值是通过malloc函数申请的空间,因此调用这必须使用free函数来释放指针.</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;注意:如果不能为字符串获取足够的空间函数的返回值将会为NULL</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;Function:void backtrace_symbols_fd (void *const *buffer, int size, int fd)</p><p style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;backtrace_symbols_fd与backtrace_symbols&nbsp;函数具有相同的功能,不同的是它不会给调用者返回字符串数组,而是将结果写入文件描述符为fd的文件中,每个函数对应一行.它不需要调用malloc函数,因此适用于有可能调用该函数会失败的情况。</p><div style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 1144.625px; word-break: break-all;"><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">execinfo.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdlib.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br /><br /></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Obtain&nbsp;a&nbsp;backtrace&nbsp;and&nbsp;print&nbsp;it&nbsp;to&nbsp;stdout.&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;">&nbsp;<br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;print_trace&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span>&nbsp;<span style="color: #000000;">*</span><span style="color: #000000;">array[</span><span style="color: #000000;">10</span><span style="color: #000000;">];&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;size;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span>&nbsp;<span style="color: #000000;">**</span><span style="color: #000000;">strings;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;i;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;backtrace&nbsp;(array,&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strings&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;backtrace_symbols&nbsp;(array,&nbsp;size);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">Obtained&nbsp;%zd&nbsp;stack&nbsp;frames.\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;size);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strings[i]);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free&nbsp;(strings);&nbsp;<br />}&nbsp;<br /><br /></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;A&nbsp;dummy&nbsp;function&nbsp;to&nbsp;make&nbsp;the&nbsp;backtrace&nbsp;more&nbsp;interesting.&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;">&nbsp;<br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;dummy_function&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_trace&nbsp;();&nbsp;<br />}&nbsp;<br /><br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dummy_function&nbsp;();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span>&nbsp;<span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;<br />}</span></div><span style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">编译运行的结果如下：&nbsp;</span><br style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><span style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;"># gcc bt.c -rdynamic -o bt&nbsp;</span><br style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><span style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;"># ./bt&nbsp;</span><br style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><span style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">Obtained 5 stack frames.</span><br style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><span style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">./bt(_Z11print_tracev+0x19) [0x804870d]</span><br style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><span style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">./bt(_Z14dummy_functionv+0xb) [0x8048779]</span><br style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><span style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">./bt(main+0x16) [0x8048792]</span><br style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><span style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">/lib/libc.so.6(__libc_start_main+0xdc) [0x116e9c]</span><br style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><span style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">./bt(__gxx_personality_v0+0x31) [0x8048641]</span><br style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><br style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><br style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><span style="color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">注： addr2line - convert addresses into file names and line numbers.</span><img src ="http://www.cppblog.com/wanghaiguang/aggbug/202259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-07-31 12:07 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/07/31/202259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hadoop分析之二元数据备份方案的机制（转载）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/05/24/200569.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Fri, 24 May 2013 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/05/24/200569.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/200569.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/05/24/200569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/200569.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/200569.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、NameNode启动加载元数据情景分析<br>NameNode函数里调用FSNamesystemm读取dfs.namenode.name.dir和dfs.namenode.edits.dir构建FSDirectory。<br>FSImage类recoverTransitionRead和saveNameSpace分别实现了元数据的检查、加载、内存合并和元数据的持久化存储。<br>saveNameSpace将元数据写入到磁盘，具体操作步骤：首先将current目录重命名为lastcheckpoint.tmp;然后在创建新的current目录，并保存文件；最后将lastcheckpoint.tmp重命名为privios.checkpoint.<br>checkPoint的过程：Secondary NameNode会通知nameNode产生一个edit log文件edits.new，之后所有的日志操作写入到edits.new文件中。接下来Secondary NameNode会从namenode下载fsimage和edits文件，进行合并产生新的fsimage.ckpt;然后Seco&nbsp;&nbsp;<a href='http://www.cppblog.com/wanghaiguang/archive/2013/05/24/200569.html'>阅读全文</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/200569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-05-24 15:29 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/05/24/200569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hadoop分析之一HDFS元数据解析（转载）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/05/24/200568.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Fri, 24 May 2013 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/05/24/200568.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/200568.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/05/24/200568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/200568.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/200568.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、元数据（Metadata）：维护HDFS文件系统中文件和目录的信息，分为内存元数据和元数据文件两种。NameNode维护整个元数据。&nbsp;&nbsp;<a href='http://www.cppblog.com/wanghaiguang/archive/2013/05/24/200568.html'>阅读全文</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/200568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-05-24 15:18 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/05/24/200568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vim 命令(全)</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/05/09/200122.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 09 May 2013 01:44:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/05/09/200122.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/200122.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/05/09/200122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/200122.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/200122.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如何复制第5行到第10行并粘贴到第12行之后？方法1： 光标放到第五行， 输入：y6y 光标放到第12行， 输入：p  方法2： 命令行模式下输入 :5,10 co 12  方法3： 我一般都是 先移到第五行 d6 p 再移到12行&nbsp; p  延伸一下, 有时候不想费劲看多少行或复制大量行时，可以使用标签来替代  光标移到起始行，输入ma 光标移到结束行，输入mb 光标移到粘贴行，输入mc...&nbsp;&nbsp;<a href='http://www.cppblog.com/wanghaiguang/archive/2013/05/09/200122.html'>阅读全文</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/200122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-05-09 09:44 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/05/09/200122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转载）Linux常用命令大全</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/05/06/200022.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Mon, 06 May 2013 08:29:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/05/06/200022.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/200022.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/05/06/200022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/200022.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/200022.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;Ctrl+Alt+F7和startx 进入图形界面  cat /etc/issue &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;查看ubuntu版本号  cat /etc/lsb-release 查看ubuntu版本号  uname &#8211;a 或uname -r查看内核版本  &nbsp;top&nbsp; &nbsp; &nbsp;&nbsp;查看CPU和内存...&nbsp;&nbsp;<a href='http://www.cppblog.com/wanghaiguang/archive/2013/05/06/200022.html'>阅读全文</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/200022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-05-06 16:29 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/05/06/200022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转载）Ubuntu上搭建Hadoop环境（单机模式+伪分布模式）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/05/06/200017.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Mon, 06 May 2013 07:14:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/05/06/200017.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/200017.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/05/06/200017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/200017.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/200017.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本人用的版本：ubuntu10.04 .4，hadoop 1.0.4最近一直在自学Hadoop，今天花点时间搭建一个开发环境，并整理成文。首先要了解一下Hadoop的运行模式：单机模式（standalone）&nbsp; &nbsp; &nbsp; &nbsp;单机模式是Hadoop的默认模式。当首次解压Hadoop的源码包时，Hadoop无法了解硬件安装环境，便保守地选择了最小配置。在这种默认模...&nbsp;&nbsp;<a href='http://www.cppblog.com/wanghaiguang/archive/2013/05/06/200017.html'>阅读全文</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/200017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-05-06 15:14 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/05/06/200017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 下编译并安装配置 Qt4.7.4 全过程（支持QML）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/04/08/199216.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Mon, 08 Apr 2013 09:07:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/04/08/199216.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/199216.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/04/08/199216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/199216.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/199216.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; &nbsp; &nbsp; 最近准备做 Nokia 的 Symbian,Maemo 下触摸屏开发。考虑到程序的跨平台可移植性，最终选择使用 Qt 开发。相对来说，国内关于 Qt 相关文档并不算很多。作者将 Linux 下编译并安装配置 Qt 全过程总结了一下，只希望可以方便更多的朋友！&nbsp; &nbsp; &nbsp;1、获得源代码&nbsp;&nbsp;&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.cppblog.com/wanghaiguang/archive/2013/04/08/199216.html'>阅读全文</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/199216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-04-08 17:07 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/04/08/199216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 安装 Qt 开发环境</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199044.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Tue, 02 Apr 2013 06:06:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199044.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/199044.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/199044.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/199044.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">虽然网络上很多人使用&nbsp;</span>Redhat&nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">或者</span>fedora&nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">作为上位机操作系统，但是我觉得使用</span>Ubuntu<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">最为方便，因为需要的软件包大部分都可以通过&nbsp;</span>apt-get&nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">方式来安装，而不必从源代码开始自己编译。要知道，自己编译源代码可不是一件轻松的事，因为在编译过程中经常会出现令人意外而且莫名其妙的错误。</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">我们使用的操作系统是&nbsp;</span>Ubuntu&nbsp;8.04<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">，使用目前最新版本的</span>QT&nbsp;4.4.0<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">，安装起来即为简单，只要运行以下命令就行：</span><br /><br />sudo&nbsp;apt-get&nbsp;install&nbsp;qt4-dev-tools&nbsp;qt4-doc&nbsp;qt4-qtconfig&nbsp;qt4-demos&nbsp;qt4-designer<br /><div>sudo apt-get install qtcreator</div><br /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">注意在这个版本的软件包中，</span>qt4-dev-tools&nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">包含了</span>Qt&nbsp;Assistant<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">及</span>Qt&nbsp;Linguist<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">等工具，因此不需要单独安装这两个工具。其它的，</span>qt4-doc&nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">是帮助文档，包含了</span>Qt<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">中各个类库的详细说明以及丰富的例子程序，可以使用</span>Qt&nbsp;Assistant&nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">工具来打开阅读。</span>qt4-qtconfig&nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">是配置</span>Qt<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">环境的一个对话框，一般默认就行了，很少有必要去更改。</span>qt4-demos&nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">包含很多可以运行起来的可执行文件以及源代码。</span>qt4-designer<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">是用来设计</span>GUI<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">界面的设计器。</span><br /><br /><br /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">为了连接</span>MySQL<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">数据库，需要安装连接</span>MySQL<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">的驱动程序：</span><br /><br />sudo&nbsp;apt-get&nbsp;install&nbsp;libqt4-sql-mysql<br /><br /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">比起在</span>Windows<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">下安装和配置</span>Qt<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">的</span>MySQL<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">驱动来说，简直太方便了。如果还需要其它的没有默认安装的</span>Qt<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">库，可以在命令行输入&nbsp;</span>sudo&nbsp;apt-get&nbsp;install&nbsp;libqt4-&nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">然后按</span>tab<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">键自动补全，就会列出所有以</span>libqt4-&nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">开头的软件包，如下图所示：</span><br /><br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufanking/EntryImages/20081111/aaa.jpg" align="" style="border: none; " /><br /><br /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">这些都可以使用一个命令搞定，而不需要自己从源码开始编译。在记不准或不知道名字的情况下，使用</span>tab<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">键列出所有可选的软件包是一个很实用的小技巧。</span><br /><br /><br /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">在我的项目中，还需要画一些数据曲线和统计图表等，而第三方的</span>QWT<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">库提供了这些功能。同样，只需要一个命令即可完成安装：</span><br /><br /><br />sudo&nbsp;apt-get&nbsp;install&nbsp;libqwt5-qt4&nbsp;libqwt5-qt4-dev<br /><br /><br /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">这时，打开</span>Qt&nbsp;Designer<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">，就会发现左边的</span>Widget<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">列表里面多了&#8220;</span>Qwt&nbsp;Widget&#8221;<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">这一组。</span><br /><br /><br /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">最后，关于集成开发环境我觉得</span>QDevelop<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">很不错，它跟</span>Qt&nbsp;Designer<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">结合的很好，而且有提示类成员函数的功能。运行以下命令安装：</span><br /><br /><br />&nbsp;sudo&nbsp;apt-get&nbsp;install&nbsp;qdevelop&nbsp;<br /><br /><br /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">这样，使用</span>Qdevelop<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">编写代码和编译、调试，使用</span>Qt&nbsp;Designer<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">设计界面，开发效率较高<br /><br />本文转自：</span><a href="http://blog.csdn.net/zhoufanking/article/details/3278790">http://blog.csdn.net/zhoufanking/article/details/3278790</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/199044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-04-02 14:06 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 出现apt-get: Package has no installation candidate问题</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199042.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Tue, 02 Apr 2013 05:41:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199042.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/199042.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/199042.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/199042.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><span style="font-family: Arial, Helvetica, simsun, u5b8bu4f53; color: #626a0f; background-color: #f4f0e8; ">今天在安装软件的时候出现了Package&nbsp;has&nbsp;no&nbsp;installation&nbsp;candidate的问题，如：</span><br /><span style="color: #0000ff; "><strong>#&nbsp;&nbsp;apt-get&nbsp;install&nbsp;&lt;packagename&gt;</strong></span><br />Reading&nbsp;package&nbsp;lists...&nbsp;Done<br />Building&nbsp;dependency&nbsp;tree...&nbsp;Done<br />Package&nbsp;aptitude&nbsp;is&nbsp;not&nbsp;available,&nbsp;but&nbsp;is&nbsp;referred&nbsp;to&nbsp;by&nbsp;another&nbsp;package.<br />This&nbsp;may&nbsp;mean&nbsp;that&nbsp;the&nbsp;package&nbsp;is&nbsp;missing,&nbsp;has&nbsp;been&nbsp;obsoleted,&nbsp;or<br />is&nbsp;only&nbsp;available&nbsp;from&nbsp;another&nbsp;source<br /><strong>E:&nbsp;Package&nbsp;&lt;packagename&gt;&nbsp;has&nbsp;no&nbsp;installation&nbsp;candidate</strong><br /><span style="font-family: Arial, Helvetica, simsun, u5b8bu4f53; color: #626a0f; background-color: #f4f0e8; ">解决方法如下：</span><br /><span style="font-family: Arial, Helvetica, simsun, u5b8bu4f53; color: #0000ff; background-color: #f4f0e8; "><strong>#&nbsp;apt-get&nbsp;update</strong></span></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><span style="font-family: Arial, Helvetica, simsun, u5b8bu4f53; color: #0000ff; background-color: #f4f0e8; "><strong>【更新同步安装列表。在这一步之前可能还需要添加新的源，比如</strong></span></p><p style="margin: 0pt 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">vim&nbsp;/etc/apt/sources.list&nbsp;<span style="font-family: 宋体; ">我添加了</span><span style="font-family: 'Times New Roman'; ">2</span><span style="font-family: 宋体; ">个</span></p><p style="margin: 0pt 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">deb&nbsp;http://mirrors.163.com/ubuntu/&nbsp;hardy&nbsp;main&nbsp;universe</p><p style="margin: 0pt 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">deb&nbsp;http://tw.archive.ubuntu.com/ubuntu/&nbsp;hardy&nbsp;main&nbsp;universe</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><span style="font-family: Arial, Helvetica, simsun, u5b8bu4f53; color: #0000ff; background-color: #f4f0e8; "><strong>】<br />#&nbsp;apt-get&nbsp;upgrade【升级所有可升级的已安装包？我没做这一步，也可以】<br />#&nbsp;apt-get&nbsp;install&nbsp;&lt;packagename&gt;</strong></span><br /><span style="font-family: Arial, Helvetica, simsun, u5b8bu4f53; color: #626a0f; background-color: #f4f0e8; ">这样就可以正常使用apt-get了～<br /><br />本文转自：</span><a href="http://hi.baidu.com/lozard/item/03b854f5a8630015e2e3bd0a">http://hi.baidu.com/lozard/item/03b854f5a8630015e2e3bd0a</a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/199042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-04-02 13:41 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 10.04安装中文输入法</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199041.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Tue, 02 Apr 2013 05:40:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199041.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/199041.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/199041.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/199041.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">安装SCIM输入法的步骤</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><br />打开终端，在终端输入执行以下命令：<br />1).终端输入：sudo apt-get remove scim<br /><br />删除安装系统的时候装的那个scim（个人觉得没什么用，因为一般新安装是操作系统没有装这个）<br /><br />2）sudo apt-get install scim<br /><br />然后下载安装scim输入法。下载完了系统会自己装上，中间会有提示，直接y就OK了<br /><br />3）sudo apt-get install scim-chinese<br /><br />这一步是最重要的，这是下载安装中文输入法，前面那一步只是下载一个可以运行输入法的平台&nbsp;，现在是在这个具体平台上安装<br /><br /><br />中文输入法<br /><br />4) sudo nano /etc/X11/Xsession.d /95xinput<br /><br />这个步骤就利用nano新建一个95xinput的文件&nbsp;，该文件的具体内容如下：<br /><br />&nbsp;<span style="color: #ff0000; ">/usr/bin/scim -d&nbsp;&nbsp;<br />XMODIFIERS="@im=SCIM"&nbsp;&nbsp;<br />export XMODIFIERS&nbsp;&nbsp;<br />export GTK_IM_MODULE=scim</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">然后，确定无误后，保存，<span style="color: #ff0000; ">按ctrl + o，输入文件名保存</span>&nbsp;，ctrl+x 退出<br /><br />5）exit 退出终端</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">6）在系统管理中：语言支持的键盘输入方式调整为scim<br />7）<span style="color: #ff0000; ">重新启动电脑，进入系统通过Crtl＋Space切换输入法<br /><br /></span><span>本文转自：</span><a href="http://blog.csdn.net/caodesheng110/article/details/7896481">http://blog.csdn.net/caodesheng110/article/details/7896481</a><a href="http://blog.csdn.net/caodesheng110/article/details/7896481"><span></span></a></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/199041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-04-02 13:40 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/04/02/199041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hadoop笔记本</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/02/27/198117.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Wed, 27 Feb 2013 08:09:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/02/27/198117.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/198117.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/02/27/198117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/198117.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/198117.html</trackback:ping><description><![CDATA[<table border="0" align="left" style="border-style: solid; border-color: #c0c0c0; border-collapse: collapse; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #ffffff;"><tbody><tr><td align="left" valign="top" style="font-size: 12px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; padding: 3px; width: 500px; word-break: normal !important;"><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">海量数据</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/10/09/2717383.html" style="color: navy; text-decoration: initial;">大数据量，海量数据 处理方法总结</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/10/09/2717450.html" style="color: navy; text-decoration: initial;">布隆过滤器应用</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/10/09/2717385.html" style="color: navy; text-decoration: initial;">悉数那些&#8220;巨型&#8221;数据仓库</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608773.html" style="color: navy; text-decoration: initial;">Hadoop在业界的使用情况</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/10/09/2717393.html" style="color: navy; text-decoration: initial;">淘宝Hadoop集群的概况</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　分布式</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/10/09/2717412.html" style="color: navy; text-decoration: initial;">Paxos在大型系统中常见的应用场景</a></p></td><td align="left" valign="top" style="font-size: 12px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; padding: 3px; width: 500px; word-break: normal !important;"><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">hadoop的实现</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/06/09/2543543.html" style="color: navy; text-decoration: initial;">序</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/02/01/2889131.html" style="color: navy; text-decoration: initial;">HDFS的基本概念</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;"><span style="line-height: 1.5;">　　　　</span><a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/23/2465793.html" style="color: navy; text-decoration: initial;">HDFS 读写流程</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/02/04/2889386.html" style="color: navy; text-decoration: initial;">HDFS namenode源码分析</a>&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/02/16/2913041.html" style="color: navy; text-decoration: initial;">HDFS datanode源码分析</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　 &nbsp;<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/02/19/2915307.html" style="color: navy; text-decoration: initial;">HDFS dfsclient读文件过程 源码分析</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　 &nbsp;<a href="http://www.cnblogs.com/ggjucheng/archive/2013/02/19/2917020.html" style="color: navy; text-decoration: initial;">HDFS dfsclient写文件过程 源码分析</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/02/20/2917799.html" style="color: navy; text-decoration: initial;">MapReduce源码分析总结</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465782.html" style="color: navy; text-decoration: initial;">mapreduce作业流程概论</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/23/2465820.html" style="color: navy; text-decoration: initial;">How MapReduce Works</a>&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/08/17/2644746.html" style="color: navy; text-decoration: initial;">基于hadoop的crc校验谈hadoop的离线设计思想</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465580.html" style="color: navy; text-decoration: initial;">Hadoop在MapReduce中使用压缩详解</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/23/2465816.html" style="color: navy; text-decoration: initial;">HDFS数据的Checksum</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/23/2465845.html" style="color: navy; text-decoration: initial;">Hadoop开发常用的InputFormat和OutputFormat</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="CategoryEntryList1_EntryStoryList_Entries_TitleUrl_2" href="http://www.cnblogs.com/ggjucheng/archive/2012/04/26/2472842.html" style="color: navy; text-decoration: initial;">Hadoop之failed task和killed task</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608786.html" style="color: navy; text-decoration: initial;">Hadoop的调度器总结</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　管理</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/17/2454538.html" style="color: navy; text-decoration: initial;">hadoop集群部署</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608735.html" style="color: navy; text-decoration: initial;">hadoop部署注意项</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/17/2454549.html" style="color: navy; text-decoration: initial;">hadoop配置文件说明</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/17/2454590.html" style="color: navy; text-decoration: initial;">hadoop集群默认配置和常用配置</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　 &nbsp;<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843037.html" style="color: navy; text-decoration: initial;">hadoop集群测量</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/20/2868906.html" style="color: navy; text-decoration: initial;">Hadoop管理员的十个最佳实践</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/31/2886981.html" style="color: navy; text-decoration: initial;">Hadoop 权限管理</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/18/2454671.html" style="color: navy; text-decoration: initial;">Hadoop FS Shell</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/18/2454680.html" style="color: navy; text-decoration: initial;">Hadoop Shell 讲解</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842959.html" style="color: navy; text-decoration: initial;">hadoop fs -count的结果含义</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="CategoryEntryList1_EntryStoryList_Entries_TitleUrl_17" href="http://www.cnblogs.com/ggjucheng/archive/2012/04/18/2454689.html" style="color: navy; text-decoration: initial;">Hadoop添加节点datanode</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/18/2454690.html" style="color: navy; text-decoration: initial;">Hadoop删除节点</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/18/2454692.html" style="color: navy; text-decoration: initial;">hadoop SecondaryNameNode和NameNode</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/18/2454693.html" style="color: navy; text-decoration: initial;">hadoop 根据SecondaryNameNode恢复Namenode</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843015.html" style="color: navy; text-decoration: initial;">hadoop机架感知</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/18/2454691.html" style="color: navy; text-decoration: initial;">HDFS 安全模式</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/18/2454696.html" style="color: navy; text-decoration: initial;">hadoop的dfs.replication</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;"><span style="line-height: 1.5;">　　　　</span><a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/18/2454683.html" style="color: navy; text-decoration: initial;">Hadoop回收站trash</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465649.html" style="color: navy; text-decoration: initial;">hadoop升级</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608790.html" style="color: navy; text-decoration: initial;">Hadoop计算能力调度器算法解析</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608817.html" style="color: navy; text-decoration: initial;">Hadoop计算能力调度器应用和配置</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/12/10/2811223.html" style="color: navy; text-decoration: initial;">hadoop和kerberos的整合总结</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842969.html" style="color: navy; text-decoration: initial;">hadoop的dfs.umask</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/20/2868823.html" style="color: navy; text-decoration: initial;">NFS服务对Hadoop（hdfs）集群影响测试</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/20/2868827.html" style="color: navy; text-decoration: initial;">Facebook团队关于Hadoop/HBase在SSD上的实验和讨论</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　调优</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　架构设计</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608677.html" style="color: navy; text-decoration: initial;">Hadoop使用场景</a></p></td><td align="left" valign="top" style="font-size: 12px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; padding: 3px; width: 500px; word-break: normal !important;"><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">hive</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/31/2886911.html" style="color: navy; text-decoration: initial;">Hive体系架构</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　应用</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608757.html" style="color: navy; text-decoration: initial;">Hadoop和Hive的数据处理流程</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　管理</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/26/2471341.html" style="color: navy; text-decoration: initial;">hive部署手册</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842824.html" style="color: navy; text-decoration: initial;">hive元数据中utf8的修改</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　 &nbsp;<a href="http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608633.html" style="color: navy; text-decoration: initial;">hive并发调用的运行方式-个人经验篇</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　　</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/04/2844987.html" style="color: navy; text-decoration: initial;">hive Cli常用操作(翻译自Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="homepage1_HomePageDays_DaysList_DayItem_2_DayList_2_TitleUrl_0" href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843448.html" style="color: navy; text-decoration: initial;">hive数据类型(翻译自Hive Wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/01/04/2844393.html" style="color: navy; text-decoration: initial;">hive 创建/删除/截断 表(翻译自Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/01/04/2844673.html" style="color: navy; text-decoration: initial;">hive数据操作(翻译自Hive wiki+实例讲解)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/31/2868941.html" style="color: navy; text-decoration: initial;">hive原生和复合类型的数据加载和使用</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　 &nbsp;<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843393.html" style="color: navy; text-decoration: initial;">hive修改 表/分区语句</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="homepage1_HomePageDays_DaysList_DayItem_0_DayList_0_TitleUrl_0" href="http://www.cnblogs.com/ggjucheng/archive/2013/01/08/2845004.html" style="color: navy; text-decoration: initial;">hive select操作(翻译自Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/09/2853798.html" style="color: navy; text-decoration: initial;">hive GroupBy操作(翻译自Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;"><span style="line-height: 1.5;">　　 &nbsp;　&nbsp;</span><a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843243.html" style="color: navy; text-decoration: initial;">hive 中 Order by, Sort by ,Dristribute by,Cluster By 的作用和用法</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/15/2860723.html" style="color: navy; text-decoration: initial;">Hive Join(翻译自Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　&nbsp;<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842938.html" style="color: navy; text-decoration: initial;">hive lateral view语句(翻译自Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/15/2861574.html" style="color: navy; text-decoration: initial;">Hive Union(翻译自Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/15/2861628.html" style="color: navy; text-decoration: initial;">Hive子查询(翻译自Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　&nbsp;<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842855.html" style="color: navy; text-decoration: initial;">hive实例讲解实现in和not in子句</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/16/2861665.html" style="color: navy; text-decoration: initial;">Hive Explain(翻译自Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/16/2862402.html" style="color: navy; text-decoration: initial;">Hive虚拟列(翻译自Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　　<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/01/16/2862749.html" style="color: navy; text-decoration: initial;">hive 锁定(翻译自Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　 &nbsp;&nbsp;<a href="https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-StringFunctions" style="color: navy; text-decoration: initial;">hive函数(Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="https://cwiki.apache.org/confluence/display/Hive/HivePlugins" style="color: navy; text-decoration: initial;">hive udf开发流程(Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/02/01/2888051.html" style="color: navy; text-decoration: initial;">hive udaf开发入门和运行过程详解</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/02/01/2888819.html" style="color: navy; text-decoration: initial;">hive中UDTF编写和使用</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-CommandLineInterface" style="color: navy; text-decoration: initial;">hive属性(Hive wiki)</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/01/30/2868993.html" style="color: navy; text-decoration: initial;">hive中分组取前N个值的实现</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a id="cb_post_title_url" href="http://www.cnblogs.com/ggjucheng/archive/2013/01/08/2850797.html" style="color: navy; text-decoration: initial;">hive sql遇到的问题</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　优化</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842860.html" style="color: navy; text-decoration: initial;">hive大数据倾斜总结</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842821.html" style="color: navy; text-decoration: initial;">hive join详解</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;　　　　</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843318.html" style="color: navy; text-decoration: initial;">hive文件存储格式</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843249.html" style="color: navy; text-decoration: initial;">hive怎样决定reducer个数</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843231.html" style="color: navy; text-decoration: initial;">hive的hive.exec.parallel参数说明</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843216.html" style="color: navy; text-decoration: initial;">hive local hadoop特性</a>　　　　</p></td><td align="left" valign="top" style="font-size: 12px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; padding: 3px; width: 500px; word-break: normal !important;"><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">hbase</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　管理</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/05/04/2483474.html" style="color: navy; text-decoration: initial;">Hbase配置手册</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">pig</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　介绍入门</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2013/01/20/2868923.html" style="color: navy; text-decoration: initial;">Apache Pig入门 &#8211;介绍/基本架构/与Hive对比</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　管理</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.cnblogs.com/ggjucheng/archive/2012/04/26/2471353.html" style="color: navy; text-decoration: initial;">pig部署手册</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　教程</p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　　　<a href="http://www.codelast.com/?p=4550" style="color: navy; text-decoration: initial;">Apache Pig中文教程集合</a></p><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px;">　　</p></td></tr></tbody></table><p style="font-size: 13px; line-height: 1.4; margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #ffffff;">&nbsp;<br />本文转自：http://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465625.html</p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/198117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-02-27 16:09 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/02/27/198117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux GDB调试++程序</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/02/27/198113.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Wed, 27 Feb 2013 07:38:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/02/27/198113.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/198113.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/02/27/198113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/198113.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/198113.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许，各位比较喜欢那种图形界面方式的，像VC、BCB等IDE的调试，但如果你是在 UNIX平台下做软件，你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓&#8220;寸有所长，尺有所短&#8221;就是这个道理。 一般来说，GDB主要帮忙你完成下面四个方面的功能：</span></p><ol style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><span style="font-size: 12pt; font-family: 'Lucida Console';">启动你的程序，可以按照你的自定义的要求随心所欲的运行程序。</span></li><li style="margin: 0px; padding: 0px;"><span style="font-size: 12pt; font-family: 'Lucida Console';">可让被调试的程序在你所指定的调置的断点处停住。（断点可以是条件表达式）</span></li><li style="margin: 0px; padding: 0px;"><span style="font-size: 12pt; font-family: 'Lucida Console';">当程序被停住时，可以检查此时你的程序中所发生的事。</span></li><li style="margin: 0px; padding: 0px;"><span style="font-size: 12pt; font-family: 'Lucida Console';">动态的改变你程序的执行环境。</span></li></ol><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从上面看来，GDB和一般的调试工具没有什么两样，基本上也是完成这些功能，不过在细节上，你会发现GDB这个调试工具的强大，大家可能比较习惯了图形化的调试工具，但有时候，命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">gdb基本命令列表：&nbsp;&nbsp;&nbsp;</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&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; &nbsp; &nbsp;<img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/gdb1.gif" width="490" height="398" alt="" /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">实例:</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">1 新建一个源文件vi swap.cc</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/gdb2.gif" width="874" height="442" alt="" /><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">源文件内容如下：</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">#include&lt;iostream&gt;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">using namespace std;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">void swap(int &amp;a,int &amp;b)</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">{</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tmp;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp=a;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a=b;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b=tmp;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">}</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">int main()</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">{</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i,j;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;endl&lt;&lt;"Input two int number:"&lt;&lt;endl;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin&gt;&gt;i&gt;&gt;j;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"Before swap(),i="&lt;&lt;i&lt;&lt;" j="&lt;&lt;j&lt;&lt;endl;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(i,j);</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"After swap(),i="&lt;&lt;i&lt;&lt;" j="&lt;&lt;j&lt;&lt;endl&lt;&lt;endl;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span><br style="margin: 0px; padding: 0px;" /><span style="font-size: 12pt; font-family: 'Lucida Console';">}</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">直接复制粘贴生成源文件</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;2.生成可执行文件 g++ -g -o swap swap.cc，</span><span style="margin: 0px; padding: 0px; color: #ff0000; font-size: 12pt; font-family: 'Lucida Console';">注意必须使用</span><span style="margin: 0px; padding: 0px; color: #ff0000; font-size: 12pt; font-family: 'Lucida Console';">-g参数</span><span style="font-size: 12pt; font-family: 'Lucida Console';">，编译会加入调试信息，否则无法调试执行文件</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img alt="" src="http://hi.csdn.net/attachment/201203/19/0_1332131674N111.gif" style="margin: 0px; padding: 0px; border: none;" /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">3.启动调试&nbsp;</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">gdb swap</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/gdb3.gif" width="927" height="247" alt="" /><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.1&nbsp; 查看源文件&nbsp;</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">list 1</span><span style="font-size: 12pt; font-family: 'Lucida Console';">，回车重复上一次指令</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/gdb4.gif" width="717" height="346" alt="" /><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.2设置调试断点&nbsp;</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">break 16</span><span style="font-size: 12pt; font-family: 'Lucida Console';">，在第16行设置断点，</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">info break</span><span style="font-size: 12pt; font-family: 'Lucida Console';">查看断点信息（亦可使用缩写</span><span style="margin: 0px; padding: 0px; font-size: 24px; color: #ff6666;"><span style="margin: 0px; padding: 0px; color: #ff0000; font-size: 12pt; font-family: 'Lucida Console';">i b</span></span><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;）</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/gdb5.gif" width="840" height="121" alt="" /><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/13.gif" width="852" height="142" alt="" /><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.3 调试&nbsp;&nbsp;运行 输入</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">run&nbsp;</span><span style="font-size: 12pt; font-family: 'Lucida Console';">或者</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">r&nbsp;</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/gdb6.gif" width="739" height="184" alt="" /><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.3 单步调试，</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">step&nbsp;<span style="margin: 0px; padding: 0px; font-size: 12pt; color: #000000; font-family: 'Lucida Console';">或者</span></span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">&nbsp;s</span><span style="font-size: 12pt; font-family: 'Lucida Console';">进入函数内部</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/gdb7.gif" width="618" height="223" alt="" /><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4查看变量</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">&nbsp;print b&nbsp;</span><span style="font-size: 12pt; font-family: 'Lucida Console';">或者&nbsp;</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">p b</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/gdb8.gif" width="447" height="185" alt="" /><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.5查看函数堆栈</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">bt</span><span style="font-size: 12pt; font-family: 'Lucida Console';">，退出函数</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">finish</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/14.gif" width="867" height="182" alt="" /><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.6&nbsp; 继续运行直到下一个断点或主函数结束</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">continue</span><span style="font-size: 12pt; font-family: 'Lucida Console';">或者</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">c</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/gdb10.gif" width="350" height="141" alt="" /><br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.7 退出调试 输入</span><span style="margin: 0px; padding: 0px; font-size: 12pt; color: #ff0000; font-family: 'Lucida Console';">q</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><img src="http://www.cppblog.com/images/cppblog_com/wanghaiguang/gdb/gdb11.gif" width="355" height="82" alt="" /><br /><br /><span style="font-size: 12pt; font-family: 'Lucida Console';">本文转自：http://blog.csdn.net/wfdtxz/article/details/7368357</span><br /><br /><span style="font-size: 12pt; font-family: 'Lucida Console';">其他链接：http://blog.csdn.net/zzymusic/article/details/4815142</span><br /><div><span style="font-size: 12pt; font-family: 'Lucida Console';">&nbsp; &nbsp; &nbsp; &nbsp; http://blog.sina.com.cn/s/blog_7dc317590101bouz.html</span></div><img src ="http://www.cppblog.com/wanghaiguang/aggbug/198113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-02-27 15:38 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/02/27/198113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超实用的Linux/Unix快捷键大汇总（转载）</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/02/25/198055.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Mon, 25 Feb 2013 01:57:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/02/25/198055.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/198055.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/02/25/198055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/198055.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/198055.html</trackback:ping><description><![CDATA[<p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　近期在工作中发现，许多同事，尤其是我们的PHP开发者，基本不会用Linux/unix下的快捷方式，严重影响工作效率，所以特撰写此文，每个用法后我会详细注释。</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　下述所有命令在Linux/unix的shell下有效，这里以bash为主。如有出入，以你自己的</span><a href="http://server.chinaitlab.com/" target="_blank" style="margin: 0px; padding: 0px; word-wrap: break-word; text-decoration: initial; color: #0000ff; line-height: 22px;"><span style="font-size: 12pt;">服务器</span></a><span style="font-size: 12pt;">为准。本文所指的Linux主要指RHEL/CentOS，unix指的是FreeBSD，这也是</span><a href="http://server.chinaitlab.com/" target="_blank" style="margin: 0px; padding: 0px; word-wrap: break-word; text-decoration: initial; color: #0000ff; line-height: 22px;"><span style="font-size: 12pt;">服务器</span></a><span style="font-size: 12pt;">中用得最多的版本。</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + a 切换到命令行开始</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　这个操作跟Home实现的结果一样的，但Home在某些unix环境下无法使用，便可以使用这个组合；在Linux下的vim，这个也是有效的；另外，在windows的许多文件编辑器里，这个也是有效的。</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + e 切换到命令行末尾</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　这个操作跟END实现的结果一样的，但End键在某些unix环境下无法使用，便可以使用这个组合；在Linux下的vim，这个也是有效的；另外，在windows的许多文件编辑器里，这个也是有效的。</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + l 清除屏幕内容，效果等同于clear</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + u 清除剪切光标之前的内容</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　这个命令很有用，在nslookup里也是有效的。我有时看见同事一个字一个字的删除shell命令，十分崩溃！其实完全可以用一个Ctrl + u搞定。</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + k 剪切清除光标之后的内容</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + y 粘贴刚才所删除的字符</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　此命令比较强悍，删除的字符有可能是几个字符串，但极有可能是一行命令。</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + r 在历史命令中查找 （这个非常好用，输入关键字就调出以前的命令了）</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　这个命令我强烈推荐，有时history比较多时，想找一个比较复杂的，直接在这里，shell会自动查找并调用，方便极了</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + c 终止命令</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + d 退出shell，logout</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + z 转入后台运行</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　不过，由Ctrl + z转入后台运行的进程在当前用户退出后就会终止，所以用这个不如用nohup命令&amp;，因为nohup命令的作用就是用户退出之后进程仍然继续运行，而现在许多脚本和命令都要求在root退出时仍然有效。</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　下面再被充下大家不是太熟悉，我用得比较多的操作方式：</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　!!&nbsp; 重复执行最后一条命令</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　history 显示你所有执行过的编号+历史命令。这个可以配合!编辑来执行某某命令</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　&#8593;(Ctrl+p) 显示上一条命令</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　&#8595;(Ctrl+n) 显示下一条命令</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　!$ 显示系统最近的一条参数</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　最后这个比较有用，比如我先用cat /etc/sysconfig/network-scripts/ifconfig-eth0，然后我想用vim编辑。一般的做法是先用&#8593; 显示最后一条命令，然后用Home移动到命令最前，删除cat，然后再输入vim命令。其实完全可以用vim !$来代替。</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　开发和管理员的话，掌握以上用法后，基本上工作就很有效率了；用到最后，你会不经意发现，弹指之间，许多复杂的指令你会很轻松的搞定。</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;">　　<strong style="margin: 0px; padding: 0px; word-wrap: break-word; font-size: 12pt;">附录：Linux下的桌面环境的快捷方式</strong></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　以下指令在Linux/unix的桌面环境(gnome)下有效，如有出入以你自己的服务器为准：</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt + F1 类似</span><a href="http://windows.chinaitlab.com/" target="_blank" style="margin: 0px; padding: 0px; word-wrap: break-word; text-decoration: initial; color: #0000ff; line-height: 22px;"><span style="font-size: 12pt;">Windows</span></a><span style="font-size: 12pt;">下的Win键，在GNOME中打开"应用程序"菜单(Applications)</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt + F2 类似</span><a href="http://windows.chinaitlab.com/" target="_blank" style="margin: 0px; padding: 0px; word-wrap: break-word; text-decoration: initial; color: #0000ff; line-height: 22px;"><span style="font-size: 12pt;">Windows</span></a><span style="font-size: 12pt;">下的Win + R组合键，在GNOME中运行应用程序</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + Alt + D 类似Windows下的Win + D组合键，显示桌面</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + Alt + L 锁定桌面并启动屏幕保护程序</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt + Tab 同Windows下的Alt + Tab组合键，在不同程序窗口间切换</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　PrintScreen 全屏抓图</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt + PrintScreen 当前窗口抓图</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + Alt + &#8594; / &#8592; 在不同工作台间切换</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl + Alt + Shift + &#8594; / &#8592; 移动当前窗口到不同工作台</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+Alt+Shift+Fn 终端N或模拟终端N(n和N为数字1－6)</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+Alt+Shift+F7 返回桌面</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+Alt+Shift+F8 未知（终端或模拟终端）</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　窗口操作快捷键</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt + F4 关闭窗口</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt + F5 取消最大化窗口 (恢复窗口原来的大小)</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt + F7 移动窗口 (注: 在窗口最大化的状态下无效)</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt + F8 改变窗口大小 (注: 在窗口最大化的状态下无效)</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt + F9 最小化窗口</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt + F10 最大化窗口</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt + Space 打开窗口的控制菜单 (点击窗口左上角图标出现的菜单）</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　应用程序中的常用快捷键</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　下面这些并不适用于所有程序。可以和Windows下的快捷键类比下：</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+N 新建窗口</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+X 剪切</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+C 复制</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+V 粘贴</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+Z 撤销上一步操作</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+Shift+Z 重做刚撤销的一步操作</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+S 保存</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　文件浏览器</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+H 显示隐藏文件（切换键）</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+T 新建标签</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+Page Up 上一个标签</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Ctrl+Page Down 下一个标签</span></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><span style="font-size: 12pt;">　　Alt+N 切换到第N个标签（N为数字）</span><br /><br /><div><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; line-height: 21px;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开终端的方式：</span><br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; line-height: 21px;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.鼠标点右键--terminal,即可打开。</span><br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; line-height: 21px;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.点任务栏的&#8220;application&#8221;里面的&#8220;terminal&#8221;打开</span><br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; line-height: 21px;"><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.命令方式：Alt＋F2后在出现"运行应用程序"中输入x-terminal-emulator(一般在你输入到x-term后系统会自己显示全部)或者输入&#8220;gnome-terminal&#8220;</span></p></div><br /><span style="font-size: 12pt;">本为转自：</span><span style="font-size: 12pt;">http://linux.chinaitlab.com/command/815732.html</span></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/198055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-02-25 09:57 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/02/25/198055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手动编译QT文件</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/12/05/196010.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Wed, 05 Dec 2012 09:26:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/12/05/196010.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/196010.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/12/05/196010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/196010.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/196010.html</trackback:ping><description><![CDATA[<span style="font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; &nbsp; 在ubuntu虚拟机下手动编译QT文件总是出现：</span><span style="color: red; font-family: Verdana; font-size: 12pt;">make: 没有什么可以做的为 `first'。</span><span style="font-family: Verdana; font-size: 12pt;">可以再</span><span style="background-color: #ffffff; font-family: Verdana; font-size: 12pt; line-height: 24px; white-space: pre-wrap;">在Creator中单击构建选项 ---》  清理所有项目  然后重新运行。<br /></span><span style="font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; &nbsp; 编译步骤如下：<br /></span>&nbsp; &nbsp;<br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; &nbsp; 打开终端，输入以下命令进行预处理。</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; &nbsp; qmake -project</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; &nbsp; qmake TestGUI.pro</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; &nbsp; make</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; &nbsp; 然后终端会跳出一大串信息，编译成功</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; &nbsp; 接着运行./TestGUI</span><br />&nbsp; &nbsp; &nbsp;<img src ="http://www.cppblog.com/wanghaiguang/aggbug/196010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-12-05 17:26 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/12/05/196010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>经典vim插件功能说明、安装方法和使用方法介绍（已更新）</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/11/09/194973.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Fri, 09 Nov 2012 05:59:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/11/09/194973.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/194973.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/11/09/194973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/194973.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/194973.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;1 #=============================================================================&nbsp;&nbsp;2&nbsp;&nbsp;本文转自:&nbsp;http://blog.csdn.net/tge7618291&nbsp;&nbsp;&nbsp;&nbsp; 下载地址1：http:/...&nbsp;&nbsp;<a href='http://www.cppblog.com/wanghaiguang/archive/2012/11/09/194973.html'>阅读全文</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/194973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-11-09 13:59 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/11/09/194973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动生成makefile（转载）</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/11/08/194879.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 08 Nov 2012 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/11/08/194879.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/194879.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/11/08/194879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/194879.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/194879.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 为了编译一个简单的源文件main.c,需要自动生成一个makefile,以下是步骤：第一步：----------在/root/project/main目录下创建一个文件main.c,其内容如下：------------------------------------------------#include &lt;stdio.h&gt; int main(int argc, char** argv...&nbsp;&nbsp;<a href='http://www.cppblog.com/wanghaiguang/archive/2012/11/08/194879.html'>阅读全文</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/194879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-11-08 15:37 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/11/08/194879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux平台Makefile文件的编写基础篇</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/11/08/194869.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Thu, 08 Nov 2012 05:59:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/11/08/194869.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/194869.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/11/08/194869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/194869.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/194869.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body">
<p><strong><span style="font-family: Verdana">目的：<br /></span></strong><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">基本掌握了</span><span style="font-family: Verdana" lang="EN-US"> make </span><span style="font-family: Verdana">的用法，能在</span><span style="font-family: Verdana" lang="EN-US">Linux</span><span style="font-family: Verdana">系统上编程。<br /></span><strong><span style="font-family: Verdana">环境：<br /></span></strong><strong><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><span style="font-family: Verdana" lang="EN-US">Linux</span><span style="font-family: Verdana">系统，或者有一台</span><span style="font-family: Verdana" lang="EN-US">Linux</span><span style="font-family: Verdana">服务器，通过终端连接。一句话：有</span><span style="font-family: Verdana" lang="EN-US">Linux</span><span style="font-family: Verdana">编译环境。<br /></span><strong><span style="font-family: Verdana">准备：<br /></span></strong><strong><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><span style="font-family: Verdana">准备三个文件：</span><span style="font-family: Verdana" lang="EN-US">file1.c, file2.c, file2.h<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US"><strong>file1.c:<br /></strong></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">#include &lt;stdio.h&gt;<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">#include "file2.h"<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">int main()<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">{<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">printf("print file1$$$$$$$$$$$$$$$$$$$$$$$$\n");<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">File2Print();<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">return 0;<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">}</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US"><strong>file2.h:</strong></span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">#ifndef FILE2_H_<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">#define<span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">FILE2_H_</span></p>
<p><span lang="EN-US">&nbsp;</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">#ifdef __cplusplus</span></p>
<p><span lang="EN-US"><span>&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;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">extern "C" {</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">#endif</span></p>
<p><span lang="EN-US">&nbsp;</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">void File2Print();</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">#ifdef __cplusplus</span></p>
<p><span lang="EN-US"><span>&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;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">}</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">#endif</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">#endif</span></p>
<p><span lang="EN-US"></span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US"><strong>file2.c:<br /></strong></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">#include "file2.h"<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">void File2Print()<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">{<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">printf("Print file2**********************\n");<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">}</span></p>
<p><strong><span style="font-family: Verdana">基础：<br /></span></strong><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">先来个例子：<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">有这么个</span><span style="font-family: Verdana" lang="EN-US">Makefile</span><span style="font-family: Verdana">文件。（文件和</span><span style="font-family: Verdana" lang="EN-US">Makefile</span><span style="font-family: Verdana">在同一目录）<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">=== makefile </span><span style="font-family: Verdana">开始</span><span style="font-family: Verdana" lang="EN-US"> ===<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">helloworld:file1.o file2.o<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">gcc file1.o file2.o -o helloworld<br /></span><span lang="EN-US"><span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">file1.o:file1.c file2.h<br /></span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">gcc -c file1.c -o file1.o</span></p>
<p><span lang="EN-US">&nbsp;</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">file2.o:file2.c file2.h</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">gcc -c file2.c -o file2.o</span></p>
<p><span lang="EN-US"></span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">clean:</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">rm -rf *.o helloworld</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">=== makefile </span><span style="font-family: Verdana">结束</span><span style="font-family: Verdana" lang="EN-US"> ===</span></p>
<p><span style="font-family: Verdana">一个</span><span style="font-family: Verdana" lang="EN-US"> makefile </span><span style="font-family: Verdana">主要含有一系列的规则，如下：</span><span lang="EN-US"><br /></span><span style="font-family: Verdana" lang="EN-US">A: B<br /></span><span style="font-family: Verdana" lang="EN-US">(tab)&lt;command&gt;<br /></span><span style="font-family: Verdana" lang="EN-US">(tab)&lt;command&gt;</span></p>
<p><span style="font-family: Verdana">每个命令行前都必须有</span><span style="font-family: Verdana" lang="EN-US">tab</span><span style="font-family: Verdana">符号。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span style="font-family: Verdana">上面的</span><span style="font-family: Verdana" lang="EN-US">makefile</span><span style="font-family: Verdana">文件目的就是要编译一个</span><span style="font-family: Verdana" lang="EN-US">helloworld</span><span style="font-family: Verdana">的可执行文件。让我们一句一句来解释：</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">helloworld : file1.o file2.o</span><span style="font-family: Verdana">：</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">helloworld</span><span style="font-family: Verdana">依赖</span><span style="font-family: Verdana" lang="EN-US">file1.o file2.o</span><span style="font-family: Verdana">两个目标文件。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">gcc File1.o File2.o -o helloworld</span><span style="font-family: Verdana">：</span> <span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">编译出</span><span style="font-family: Verdana" lang="EN-US">helloworld</span><span style="font-family: Verdana">可执行文件。</span><span style="font-family: Verdana" lang="EN-US">-o</span><span style="font-family: Verdana">表示你指定</span> <span style="font-family: Verdana">的目标文件名。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">file1.o : file1.c</span><span style="font-family: Verdana">：</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">file1.o</span><span style="font-family: Verdana">依赖</span><span style="font-family: Verdana" lang="EN-US">file1.c</span><span style="font-family: Verdana">文件。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">gcc -c file1.c -o file1.o</span><span style="font-family: Verdana">：</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">编译出</span><span style="font-family: Verdana" lang="EN-US">file1.o</span><span style="font-family: Verdana">文件。</span><span style="font-family: Verdana" lang="EN-US">-c</span><span style="font-family: Verdana">表示</span><span style="font-family: Verdana" lang="EN-US">gcc </span><span style="font-family: Verdana">只把给它的文件编译成目标文件，</span> <span style="font-family: Verdana">用源码文件的文件名命名但把其后缀由</span><span style="font-family: Verdana" lang="EN-US">&#8220;.c&#8221;</span><span style="font-family: Verdana">或</span><span style="font-family: Verdana" lang="EN-US">&#8220;.cc&#8221;</span><span style="font-family: Verdana">变成</span><span style="font-family: Verdana" lang="EN-US">&#8220;.o&#8221;</span><span style="font-family: Verdana">。在这句中，可以省略</span><span style="font-family: Verdana" lang="EN-US">-o file1.o</span><span style="font-family: Verdana">，编译器默认生成</span><span style="font-family: Verdana" lang="EN-US">file1.o</span><span style="font-family: Verdana">文件，这就是</span><span style="font-family: Verdana" lang="EN-US">-c</span><span style="font-family: Verdana">的作用。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">file2.o : file2.c file2.h<br />&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">gcc -c file2.c -o file2.o</span></p>
<p><span style="font-family: Verdana">这两句和上两句相同。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">clean:</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">rm -rf *.o helloworld</span></p>
<p><span style="font-family: Verdana">当用户键入</span><span style="font-family: Verdana" lang="EN-US">make clean</span><span style="font-family: Verdana">命令时，会删除</span><span style="font-family: Verdana" lang="EN-US">*.o </span><span style="font-family: Verdana">和</span><span style="font-family: Verdana" lang="EN-US">helloworld</span><span style="font-family: Verdana">文件。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span style="font-family: Verdana">如果要编译</span><span style="font-family: Verdana" lang="EN-US">cpp</span><span style="font-family: Verdana">文件，只要把</span><span style="font-family: Verdana" lang="EN-US">gcc</span><span style="font-family: Verdana">改成</span><span style="font-family: Verdana" lang="EN-US">g++</span><span style="font-family: Verdana">就行了。</span></p>
<p><span style="font-family: Verdana">写好</span><span style="font-family: Verdana" lang="EN-US">Makefile</span><span style="font-family: Verdana">文件，在命令行中直接键入</span><span style="font-family: Verdana" lang="EN-US">make</span><span style="font-family: Verdana">命令，就会执行</span><span style="font-family: Verdana" lang="EN-US">Makefile</span><span style="font-family: Verdana">中的内容了。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span style="font-family: Verdana">到这步我想你能编一个</span><span style="font-family: Verdana" lang="EN-US">Helloworld</span><span style="font-family: Verdana">程序了。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><strong><span style="font-family: Verdana">上一层楼：使用变量</span></strong></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">上面提到一句，如果要编译</span><span style="font-family: Verdana" lang="EN-US">cpp</span><span style="font-family: Verdana">文件，只要把</span><span style="font-family: Verdana" lang="EN-US">gcc</span><span style="font-family: Verdana">改成</span><span style="font-family: Verdana" lang="EN-US">g++</span><span style="font-family: Verdana">就行了。但如果</span><span style="font-family: Verdana" lang="EN-US">Makefile</span><span style="font-family: Verdana">中有很多</span><span style="font-family: Verdana" lang="EN-US">gcc</span><span style="font-family: Verdana">，那不就很麻烦了。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">第二个例子：</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">=== makefile </span><span style="font-family: Verdana">开始</span><span style="font-family: Verdana" lang="EN-US"> ===<br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">OBJS = file1.o file2.o<br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">CC = gcc<br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">CFLAGS = -Wall -O -g<br /><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">helloworld : $(OBJS)<br />&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">$(CC) $(OBJS) -o helloworld<br /><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">file1.o : file1.c file2.h<br />&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">$(CC) $(CFLAGS) -c file1.c -o file1.o<br /><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">file2.o : file2.c file2.h<br />&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">$(CC) $(CFLAGS) -c file2.c -o file2.o</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">clean:</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">rm -rf *.o helloworld<br /></span><span style="font-family: Verdana" lang="EN-US">=== makefile </span><span style="font-family: Verdana">结束</span><span style="font-family: Verdana" lang="EN-US"> ===</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">这里我们应用到了变量。要设定一个变量，你只要在一行的开始写下这个变量的名字，后</span> <span style="font-family: Verdana">面跟一个</span><span style="font-family: Verdana" lang="EN-US"> = </span><span style="font-family: Verdana">号，后面跟你要设定的这个变量的值。以后你要引用</span> <span style="font-family: Verdana">这个变量，写一个</span><span style="font-family: Verdana" lang="EN-US"> $ </span><span style="font-family: Verdana">符号，后面是围在括号里的变量名。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span style="font-family: Verdana" lang="EN-US">CFLAGS = -Wall -O &#8211;g</span><span style="font-family: Verdana">，解释一下。这是配置编译器设置，并把它赋值给</span><span style="font-family: Verdana" lang="EN-US">CFFLAGS</span><span style="font-family: Verdana">变量。</span></p>
<p><span style="font-family: Verdana" lang="EN-US">-Wall</span><span style="font-family: Verdana">：</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">输出所有的警告信息。</span></p>
<p><span style="font-family: Verdana" lang="EN-US">-O</span><span style="font-family: Verdana">：</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">在编译时进行优化。</span></p>
<p><span style="font-family: Verdana" lang="EN-US">-g</span><span style="font-family: Verdana">：</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">表示编译</span><span style="font-family: Verdana" lang="EN-US">debug</span><span style="font-family: Verdana">版本。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">这样写的</span><span style="font-family: Verdana" lang="EN-US">Makefile</span><span style="font-family: Verdana">文件比较简单，但很容易就会发现缺点，那就是要列出所有的</span><span style="font-family: Verdana" lang="EN-US">c</span><span style="font-family: Verdana">文件。如果你添加一个</span><span style="font-family: Verdana" lang="EN-US">c</span><span style="font-family: Verdana">文件，那就需要修改</span><span style="font-family: Verdana" lang="EN-US">Makefile</span><span style="font-family: Verdana">文件，这在项目开发中还是比较麻烦的。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><strong><span style="font-family: Verdana">再上一层楼：使用函数</span></strong></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">学到这里，你也许会说，这就好像编程序吗？有变量，也有函数。其实这就是编程序，只不过用的语言不同而已。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">第三个例子：</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">=== makefile </span><span style="font-family: Verdana">开始</span><span style="font-family: Verdana" lang="EN-US"> ===<br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">CC = gcc</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">XX = g++<br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">CFLAGS = -Wall -O &#8211;g</span></p>
<p><span lang="EN-US">&nbsp;</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">TARGET = ./helloworld</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">%.o: %.c</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">$(CC) $(CFLAGS) -c $&lt; -o $@</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">%.o:%.cpp</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">$(XX) $(CFLAGS) -c $&lt; -o $@</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">SOURCES = $(wildcard *.c *.cpp)<br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))</span></p>
<p><span lang="EN-US"><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">$(TARGET) : $(OBJS)<br />&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">$(XX) $(OBJS) -o $(TARGET)</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">chmod a+x $(TARGET)</span></p>
<p><span style="font-family: Verdana" lang="EN-US">clean:</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">rm -rf *.o helloworld<br /></span><span style="font-family: Verdana" lang="EN-US">=== makefile </span><span style="font-family: Verdana">结束</span><span style="font-family: Verdana" lang="EN-US"> ===</span></p>
<p><span style="font-family: Verdana">函数</span><span style="font-family: Verdana" lang="EN-US">1</span><span style="font-family: Verdana">：</span><span style="font-family: Verdana" lang="EN-US">wildcard</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">产生一个所有以</span><span style="font-family: Verdana" lang="EN-US"> '.c' </span><span style="font-family: Verdana">结尾的文件的列表。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">SOURCES = $(wildcard *.c *.cpp)</span><span style="font-family: Verdana">表示产生一个所有以</span><span style="font-family: Verdana" lang="EN-US"> .c</span><span style="font-family: Verdana">，</span><span style="font-family: Verdana" lang="EN-US">.cpp</span><span style="font-family: Verdana">结尾的文件的列表，然后存入变量</span><span style="font-family: Verdana" lang="EN-US"> SOURCES </span><span style="font-family: Verdana">里。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span style="font-family: Verdana">函数</span><span style="font-family: Verdana" lang="EN-US">2</span><span style="font-family: Verdana">：</span><span style="font-family: Verdana" lang="EN-US">patsubst</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">匹配替换，有三个参数。第一个是一个需要匹配的式样，第二个表示用什么来替换它，第三个是一个需要被处理的由空格分隔的列表。</span></p>
<p><span style="font-family: Verdana" lang="EN-US">OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))</span><span style="font-family: Verdana">表示把文件列表中所有的</span><span style="font-family: Verdana" lang="EN-US">.c,.cpp</span><span style="font-family: Verdana">字符变成</span><span style="font-family: Verdana" lang="EN-US">.o</span><span style="font-family: Verdana">，形成一个新的文件列表，然后存入</span><span style="font-family: Verdana" lang="EN-US">OBJS</span><span style="font-family: Verdana">变量中。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span style="font-family: Verdana" lang="EN-US">%.o: %.c</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">$(CC) $(CFLAGS) -c $&lt; -o $@</span></p>
<p><span style="font-family: Verdana" lang="EN-US">%.o:%.cpp</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">$(XX) $(CFLAGS) -c $&lt; -o $@</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">这几句命令表示把所有的</span><span style="font-family: Verdana" lang="EN-US">.c,.cpp</span><span style="font-family: Verdana">编译成</span><span style="font-family: Verdana" lang="EN-US">.o</span><span style="font-family: Verdana">文件。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">这里有三个比较有用的内部变量。</span><span style="font-family: Verdana" lang="EN-US">$@ </span><span style="font-family: Verdana">扩展成当前规则的目的文件名，</span><span style="font-family: Verdana" lang="EN-US"> $&lt; </span><span style="font-family: Verdana">扩展成依靠</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">列表中的第一个依靠文件，而</span><span style="font-family: Verdana" lang="EN-US"> $^ </span><span style="font-family: Verdana">扩展成整个依靠的列表（除掉了里面所有重</span> <span style="font-family: Verdana">复的文件名）。</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Verdana" lang="EN-US">chmod a+x $(TARGET)</span><span style="font-family: Verdana">表示把</span><span style="font-family: Verdana" lang="EN-US">helloworld</span><span style="font-family: Verdana">强制变成可执行文件。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">到这里，我想你已经能够编写一个比较简单也比较通用的</span><span style="font-family: Verdana" lang="EN-US">Makefile</span><span style="font-family: Verdana">文件了，上面所有的例子都假定所有的文件都在同一个目录下，不包括子目录。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">那么文件不在一个目录可以吗？</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">怎么编写</span><span style="font-family: Verdana" lang="EN-US">Makefile</span><span style="font-family: Verdana">生成静态库？</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">你还想更上一层楼吗？</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Verdana">请听下回分解。<br /><br /></span><span style="font-family: Verdana">本文转自：<a href="http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html"><span style="font-family: Verdana">http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html</span></a></span></p></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><img src ="http://www.cppblog.com/wanghaiguang/aggbug/194869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-11-08 13:59 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/11/08/194869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>