﻿<?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++博客-。。。。。。。。。。-随笔分类-c++</title><link>http://www.cppblog.com/loky/category/6637.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 10 Dec 2008 16:49:20 GMT</lastBuildDate><pubDate>Wed, 10 Dec 2008 16:49:20 GMT</pubDate><ttl>60</ttl><item><title>用GDB调试程序(8)──查看栈信息 zz</title><link>http://www.cppblog.com/loky/archive/2008/12/09/68977.html</link><dc:creator>。。。。</dc:creator><author>。。。。</author><pubDate>Tue, 09 Dec 2008 13:06:00 GMT</pubDate><guid>http://www.cppblog.com/loky/archive/2008/12/09/68977.html</guid><wfw:comment>http://www.cppblog.com/loky/comments/68977.html</wfw:comment><comments>http://www.cppblog.com/loky/archive/2008/12/09/68977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/loky/comments/commentRss/68977.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/loky/services/trackbacks/68977.html</trackback:ping><description><![CDATA[<h2 class="cjk">查看栈信息</h2>
<p style="margin-bottom: 0cm;"><font style="font-size: 9pt;" size="2">当程序被停住了，你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数，函数的地址，函数参数，函数内的局部变量都会被压入&#8220;栈&#8221;（</font><font face="文鼎PL简报宋, serif"><font style="font-size: 9pt;" size="2">Stack</font></font><font style="font-size: 9pt;" size="2">）中。你可以用</font><font face="文鼎PL简报宋, serif"><font style="font-size: 9pt;" size="2">GDB</font></font><font style="font-size: 9pt;" size="2">命令来查看当前的栈中的信息。</font></p>
<p style="margin-bottom: 0cm;"><font style="font-size: 9pt;" size="2">下面是一些查看函数调用栈信息的</font><font face="文鼎PL简报宋, serif"><font style="font-size: 9pt;" size="2">GDB</font></font><font style="font-size: 9pt;" size="2">命令：</font></p>
<p style="margin-bottom: 0cm;">&nbsp;&nbsp;&nbsp;  <font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">Backtrace</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">，</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">bt  </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">打印当前的函数调用栈的所有信息。</font></font><font style="font-size: 9pt;" size="2">如：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </font><font face="文鼎PL简报宋, serif"><font style="font-size: 9pt;" size="2"><br>
</font><font face="Consolas, monospace"><font style="font-size: 9pt;" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (gdb) bt<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #0  func (n=250) at tst.c:6<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #1  0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #2  0x400409ed in __libc_start_main () from /lib/libc.so.6</font></font><font style="font-size: 9pt;" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
</font></font><font style="font-size: 9pt;" size="2">从上可以看出函数的调用栈信息：</font><font face="文鼎PL简报宋, serif"><font style="font-size: 9pt;" size="2">__libc_start_main --&gt; main() --&gt; func()&nbsp;&nbsp;&nbsp;  <br>
</font><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">&nbsp;&nbsp;&nbsp;  backtrace &lt;n&gt;</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">， </font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">bt &lt;n&gt;     n</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">是一个正整数，表示只打印栈顶上</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">n</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">层的栈信息。</font></font></p>
<p style="margin-bottom: 0cm;">&nbsp;&nbsp;&nbsp;  <font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">backtrace &lt;-n&gt; </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">，</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">bt &lt;-n&gt;   -n</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">表一个负整数，表示只打印栈底下</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">n</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">层的栈信息。&nbsp;&nbsp;&nbsp;&nbsp;</font></font><font style="font-size: 9pt;" size="2">&nbsp;&nbsp;&nbsp;  </font><font face="文鼎PL简报宋, serif"><font style="font-size: 9pt;" size="2"><br>
</font></font><font style="font-size: 9pt;" size="2">如果你要查看某一层的信息，你需要在切换当前的栈，一般来说，程序停止时，最顶层的栈就是当前栈，如果你要查看栈下面层的详细信息，首先要做的是切换当前栈。</font></p>
<p style="text-indent: 0.48cm; margin-bottom: 0cm;"><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">frame &lt;n&gt;</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">，</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">f &lt;n&gt;   n</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">是一个从</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">0</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">开始的整数，是栈中的层编号。比如：</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">frame 0</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">，表示栈顶，</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">frame 1</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">，表示栈的第二层。</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2"><br>
&nbsp;&nbsp;   up &lt;n&gt;       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">表示向栈的上面移动</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">n</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">层，可以不打</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">n</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">，表示向上移动一层。</font></font></p>
<p style="text-indent: 0.48cm; margin-bottom: 0cm;"><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">down &lt;n&gt;         </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">表示向栈的下面移动</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">n</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">层，可以不打</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">n</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">，表示向下移动一层。 </font></font></p>
<p style="margin-bottom: 0cm;"><font style="font-size: 9pt;" size="2">上面的命令，都会打印出移动到的栈层的信息。如果你不想让其打出信息。你可以使用这三个命令：</font></p>
<p style="margin-bottom: 0cm;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">select-frame &lt;n&gt; </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">对应于 </font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">frame </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">命令。</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; up-silently &lt;n&gt; </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">对应于 </font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">up </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">命令。</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; down-silently &lt;n&gt; </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">对应于 </font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">down </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">命令。</font></font></p>
<p style="margin-bottom: 0cm;"><font style="font-size: 9pt;" size="2">查看当前栈层的信息，你可以用以下</font><font face="文鼎PL简报宋, serif"><font style="font-size: 9pt;" size="2">GDB</font></font><font style="font-size: 9pt;" size="2">命令：</font></p>
<p style="text-indent: 0.4cm; margin-bottom: 0cm;"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">frame </font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">或 </font></font><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">会打印出这些信息：栈的层编号，当前的函数名，函数参数值，函数所在文件及行号，函数执行到的语句。</font></font></p>
<font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">info frame</font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">，</font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">info f  </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">这个命令会打印出更为详细的当前栈层的信息，只不过，大多数都是运行时的内内地址。比如：函数地址，调用函数的地址，被调用函数的地址，目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。</font></font><font style="font-size: 9pt;" size="2">如：</font><font face="文鼎PL简报宋, serif"><font style="font-size: 9pt;" size="2"><br>
</font><font face="Consolas, monospace"><font style="font-size: 9pt;" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    (gdb) info f<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    Stack level 0, frame at 0xbffff5d4:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  eip = 0x804845d in func (tst.c:6); saved eip 0x8048524<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  called by frame at 0xbffff60c<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  source language c.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Arglist at 0xbffff5d4, args: n=250<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Locals at 0xbffff5d4, Previous frame's sp is 0x0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Saved registers:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ebp at 0xbffff5d4, eip at 0xbffff5d8</font></font><font style="font-size: 9pt;" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
</font><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2">&nbsp;&nbsp;&nbsp;&nbsp;  info args&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">打印出当前函数的参数名及其值。&nbsp;&nbsp;&nbsp;&nbsp;  </font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2"><br>
&nbsp;&nbsp;&nbsp;&nbsp;  info locals&nbsp;&nbsp;&nbsp;&nbsp;  </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">打印出当前函数中所有局部变量及其值。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </font></font><font face="文鼎PL简报宋, serif"><font face="Arial, sans-serif"><font style="font-size: 9pt;" size="2"><br>
&nbsp;&nbsp;&nbsp;&nbsp;  info catch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </font></font></font><font face="楷体_GB2312, monospace"><font style="font-size: 9pt;" size="2">打印出当前的函数中的异常处理信息。</font></font> <img src ="http://www.cppblog.com/loky/aggbug/68977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/loky/" target="_blank">。。。。</a> 2008-12-09 21:06 <a href="http://www.cppblog.com/loky/archive/2008/12/09/68977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>输出宏的内容</title><link>http://www.cppblog.com/loky/archive/2008/04/08/46503.html</link><dc:creator>。。。。</dc:creator><author>。。。。</author><pubDate>Tue, 08 Apr 2008 05:58:00 GMT</pubDate><guid>http://www.cppblog.com/loky/archive/2008/04/08/46503.html</guid><wfw:comment>http://www.cppblog.com/loky/comments/46503.html</wfw:comment><comments>http://www.cppblog.com/loky/archive/2008/04/08/46503.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/loky/comments/commentRss/46503.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/loky/services/trackbacks/46503.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: c++ 宏展开　输出宏定义&nbsp;&nbsp;<a href='http://www.cppblog.com/loky/archive/2008/04/08/46503.html'>阅读全文</a><img src ="http://www.cppblog.com/loky/aggbug/46503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/loky/" target="_blank">。。。。</a> 2008-04-08 13:58 <a href="http://www.cppblog.com/loky/archive/2008/04/08/46503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>