<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://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>http://jackxiang.com/post//</link>
<title><![CDATA[gdb调试器学习[原] ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Mon, 12 Nov 2007 07:51:55 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	简单示例：<br/><div class="code"><br/>gdb server<br/>b server.c 10 //在server.c的第10行断点<br/>n<br/>p<br/>bt //堆栈查看<br/>p cfg-&gt;type&nbsp;&nbsp;//查看结构体某个字段的值<br/></div><br/><br/><br/><br/>得到的函数列表：<br/>info functions<br/>启动 GDB 调试工具<br/>$ gdb --quiet<br/>info 命令列出程序信息<br/>(gdb) info proc<br/>list 命令<br/>(gdb) list main<br/>disassemble 命令<br/>(gdb) disass main<br/>========================================<br/>&nbsp;&nbsp;&nbsp;&nbsp;刚刚学了下gdb调试器的简单使用，感觉还不错，趁热打铁，把过程讲述下，自己也增强下，呵呵，废话少说，Begin！！！<br/>[root@localhost hello]# vim test.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//新建一个test.c的源文件<br/>在test.c中键入如下代码，很简单的程序：<br/>/*test.c*/<br/>#include<br/>int sum(int m);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&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;&nbsp;<br/>int main(void)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i,m =0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum(50);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=50; i!=0; i--)m+=i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;The sum of 1~50 is %d &#92;n&quot;,m);<br/>&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&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;&nbsp;<br/>int sum(int m)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i,n =0;<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum(50);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=m; i!=0; i--)n+=i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;The sum of 1~m is %d &#92;n&quot;,n);<br/>&#125;<br/>完了后保存它，返回终端<br/>[root@localhost hello]# gcc -g test.c -o test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //记得一定要加 -g，这样编译出的可执行代码才包含调试的信息，否则gdb是无法载入的 <br/>[root@localhost hello]# gdb test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //test为带有调试信息的目标文件&nbsp;&nbsp;<br/>GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)<br/>Copyright 2003 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 &quot;show copying&quot; to see the conditions.<br/>There is absolutely no warranty for GDB.&nbsp;&nbsp;Type &quot;show warranty&quot; for details.<br/>This GDB was configured as &quot;i386-redhat-linux-gnu&quot;...<br/>(gdb)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//以上的信息就是gdb的启动画面，指定了gdb的版本号等信息<br/>//然后键入 l 查看加载的文件，l表示list，b表示breakpoint，p表示print<br/>(gdb) l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //一次加载10行总[个人总结]，<br/>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*test.c*/<br/>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include<br/>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sum(int m);<br/>4<br/>5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int main(void)<br/>6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/>7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i,m =0;<br/>8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum(50);<br/>9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=50; i!=0; i--)m+=i;<br/>10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;The sum of 1~50 is %d &#92;n&quot;,m);<br/>(gdb)<br/>(gdb) l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //继续通过参数 l 加载，加载接下来的10行<br/>11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>12<br/>13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int sum(int m)<br/>14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i,n =0;<br/>16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum(50);<br/>17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=m; i!=0; i--)n+=i;<br/>18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;The sum of 1~m is %d &#92;n&quot;,n);<br/>19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>(gdb) l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //加载完毕，再加载显然是不会在加了哈<br/>Line number 20 out of range; test.c has 19 lines.<br/>//首先来看怎么设断点<br/>(gdb) b 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//b表示设断点，后面表示行号，就是加载时显示的行号<br/>Breakpoint 1 at 0x804833f: file test.c, line 8.<br/>(gdb) b 9<br/>Breakpoint 2 at 0x804834c: file test.c, line 9.<br/>(gdb) info b&nbsp;&nbsp; //我设了两个断点，通过info 来查看断点信息<br/>Num Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Disp Enb Address&nbsp;&nbsp;&nbsp;&nbsp;What<br/>1&nbsp;&nbsp; breakpoint&nbsp;&nbsp;&nbsp;&nbsp; keep y&nbsp;&nbsp; 0x0804833f in main at test.c:8<br/>2&nbsp;&nbsp; breakpoint&nbsp;&nbsp;&nbsp;&nbsp; keep y&nbsp;&nbsp; 0x0804834c in main at test.c:9<br/>(gdb)<br/>(gdb) r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//r表示run，运行至断点1，如果没设断点，则运行至结尾<br/>Starting program: /root/hello/test<br/> <br/>Breakpoint 1, main () at test.c:8<br/>8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum(50);<br/>(gdb) c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//c表示continue，继续运行<br/>Continuing.<br/>The sum of 1~m is 1275<br/> <br/>Breakpoint 2, main () at test.c:9<br/>9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=50; i!=0; i--)m+=i;<br/>(gdb)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//呵呵，上面几个操作看明白了吧<br/>//怎么来看变量值呢<br/>(gdb) l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//先用l来看看源码<br/>4<br/>5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int main(void)<br/>6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/>7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i,m =0;<br/>8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum(50);<br/>9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=50; i!=0; i--)m+=i;<br/>10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;The sum of 1~50 is %d &#92;n&quot;,m);<br/>11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>12<br/>13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int sum(int m)<br/>(gdb) p m&nbsp;&nbsp; //p表示print，打印m的值<br/>$1 = 0<br/>(gdb) p i&nbsp;&nbsp; //打印i的值，i为什么这么大，应该不用我介绍了吧<br/>$2 = 1073828704<br/>//变量知道怎么看了，那么单步运行呢<br/>(gdb) n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//n表示单步运行，这表示一次运行一行，所以它不会进入调用的函数<br/>10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;The sum of 1~50 is %d &#92;n&quot;,m);<br/>(gdb) n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//n的运行机制通过这俩个n应该要看出个门道来喽，我用颜色强调了下，明白了没<br/>The sum of 1~50 is 1275<br/>11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>//那么如果碰到调用函数怎么进入呢，不急，有办法<br/>(gdb) run<br/>The program being debugged has been started already.<br/>Start it from the beginning? (y or n) y<br/>Starting program: /root/hello/test<br/> <br/>Breakpoint 1, main () at test.c:8<br/>8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum(50);&nbsp;&nbsp; //前面设的断点，表示下一步将运行这断点所在的行<br/>(gdb) s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//用s来进入函数，也就说s也是单步运行的意思，但是它碰到函数时会进入函数运行; 而n不会，直接跳过<br/>sum (m=50) at test.c:15&nbsp;&nbsp; //仔细看看，是不是进入了sum函数哈<br/>15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i,n =0;<br/>(gdb) s<br/>17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=m; i!=0; i--)n+=i;<br/>(gdb) s<br/>18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;The sum of 1~m is %d &#92;n&quot;,n);<br/>(gdb)<br/>//这样在windows下的编译器的调试方法在gdb中都有相应的命令对应，并且更加灵活，哦忘了说怎么取消断点拉，呵呵简单<br/>(gdb) info b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//首先查看断点信息<br/>Num Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Disp Enb Address&nbsp;&nbsp;&nbsp;&nbsp;What<br/>1&nbsp;&nbsp; breakpoint&nbsp;&nbsp;&nbsp;&nbsp; keep y&nbsp;&nbsp; 0x0804833f in main at test.c:8<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breakpoint already hit 1 time<br/>2&nbsp;&nbsp; breakpoint&nbsp;&nbsp;&nbsp;&nbsp; keep y&nbsp;&nbsp; 0x0804834c in main at test.c:9<br/>(gdb) delet 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//用delet取消断点，后面的数字应该明白吧<br/>//还有其它命令可以通过输入help来查看，或者help command[需要查看的命令]来查看<br/>//退出gdb，返回终端是通过q来实现的<br/>(gdb) q<br/>The program is running.&nbsp;&nbsp;Exit anyway? (y or n) y<br/>[root@localhost hello]#<br/>还有其它很多命令，我就不一一介绍拉。&nbsp;&nbsp; 
]]>
</description>
</item><item>
<link>http://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>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>