<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[使用GDB进行调试 ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 12 Sep 2012 14:50:21 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	作者：Alexandra Hoffer URL:http://www.cprogramming.com/gdbtutorial.html<br/>翻译： Hiram Lee&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GDB （GNU Debugger的简写）是可以用于C和C++的一款强大的调试工具。调试器这个程序可以让你在程序 运行时检查程序状况来找出错误。你可以看看源代码，观察变量，跟随控制流程，在一个有限的循环中设一个断点，还有更多可以做的事。本文快速介绍一下GDB最常用和最有用的命令和技巧。<br/><br/>开始<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要使用GDB调试程序，只需在提示符后键入GDB&lt;程序名字&gt;，你也可先开启GDB，然后如果你有一个发调试的core dump文件的话，可以这样写load&lt;程序名字&gt;。当做完这些时，输入run就可以运行程序了。你可以输入C（表示控制）来与程序交互，这个C会出现在GDB的界面上。输入continue可以从GDB返回到你的程序。GDB中的所有命令都可以缩写为一个独一无二的字母，即它的首字母。因此只需输入c来代替continue。如果你感到困惑的话，GDB有一个内置的帮助系统可以给你演示你可以用GDB做的所有一切和如何做。在提示符下输入help就可进入。一旦你找到你的bug，按control_Dgo 退出GDB。 啥时运行几个GDB会立即让你不解，所确保一次只运行一个GDB程序。<br/>查看<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在GDB提示符下有两类命令你可以使用。一种命令是告诉GDB如何做，别一种只是让它给你信息。这小节我们讨论后一种命令。你可以输入print &lt;变量&gt;让GDB告诉你变量的值，这种命令就好像是在C或着C++中运行的一样，举个例子，你可以输入print myarray[5]来查看一个矩阵中特定的元素，或着输入print struc.label来查看一个结构体的成员。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lisat是另一种有用的命令，它告诉你你在哪，它会给出附近的几行代码。你再输入list,会看到下10行的代码。你可以输入list&lt;行号&gt;来查看某个特定部分的程序。举例来说，如果你想看20行的程序，输入list20。如果程序有多个源文件，你可输入list&lt;文件名&gt;：&lt;行号&gt;来标明你想发查看的部分。你可以选择使用list&lt;函数名&gt;来检查一个函数的开始。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第三个命令backtrace用于查看程序的堆栈，当输入backtrace时，你可以看到一个还没有返回和被调用的函数的清单，输入up 和down来改变范围，这样就可以看到调用函数的状态了。<br/>断点<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用GDB有很多调试的技巧，但有一些是更学用和更有用的。其中之一就是设置断点，断点是程序运行到某一个地方是自动停止，这样你就可以查看整个程序的状态。设置断点，输入break&lt;行号&gt;。break的语法同list.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和break联合使用的一个非常有用的命令叫next,这个next命令会把程序运行至下一行，然后马上再回到GDB的提示符下。 你也可以给next一个参数，例如next 100,这个程序会在运行完第100个指令时停下来。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命令watch也挺有用，无论变量的值如何改变你都可以观测这个变量和设置断点。然而，设置一个观察点会友让GDB的速度下降很多，困此除非你有自己的unix机器，尽量避免使用。<br/>Messing with<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有一组命令虽然不经常使用，这些指令实际上是在程序运行时进行修正。比如指令call会调用一个特殊的函数，set variable指令会把程序的一个变量设置为一个特称的值，，比如set varibale i = 0, Return 这个指令会把当前的函数返回到调用它的函数。<br/>技巧<br/>&nbsp;&nbsp;&nbsp;&nbsp;现在你已经学了这些简洁的命令，如何使用它们呢。 这里有一些常见的调试的问题，这些技巧就用了用武之地。<br/>1 Segfaults and Core Dumps<br/>&nbsp;&nbsp; 当你的程序发生这个错误时，怎么办？最简单的办法就是在GDB里运行直到发生了段错误。当程序崩溃时，GDB就会告诉你哪一行出错了。一般是程序中试图要对一些变量进行内存复杂操作时发生的。你可以用bt(或着backtrace)找出你所以栈的位置，再用p来查看变量，观察是否有超出范围或过多临时量的情况。有一个捷径，你用GDB调试你的程序，然后load 文件corefile,这个文件导致了崩溃。<br/>2无限循环<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;无限循环是一个很难自己找到的错误，但用gdb很简单，在GDB里load程序，运行到循环。点击control_c迫使回到GDB提示符。输入bt，就可以知道现在在哪一行。使用list查看代码，看是否能找到什么引起了循环。如果找不到的话，使用n（或着next）把一次进行一个循环，同时 使用p来查看变量。<br/>3隐晦错误<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大部分错误难以简单分类，经常出现的是你的程序给出一些不明显的原因导致 的错误输出，当出现这种问题时有这样一此技巧。一种是当你的程序要求输入时设置一个断点，然后一路next<br/>再观察栈和变量，难保一切都是按预想的进行。如果你认为你的问题是因为鞭一个变量引起的，代码上很难看出，那你就监测变量。
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 使用GDB进行调试 ]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>