<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.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://www.jackxiang.com/post//</link>
<title><![CDATA[[实践OK]gdb调试宏定义并显示宏定义的值,gdb调试时No symbol var defined in current context，局部变量不可查看问题，如何用GDB查看一个宏？ ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Wed, 18 Mar 2015 08:08:17 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：调试一个多进程学习的小程序，发出用gdb调试，出现：gdb调试时No symbol &quot;var&quot; defined in current context，if(strncmp(requestHeaderURI,TASKSURI,strlen(requestHeaderURI)) == 0)&#123;//上传分片上报链接 发现在点问题，于是查了下网络,同时发现宏好像不适合用这个函数作比较：char *strncpy(char *dest, const char *src, size_t n);。<br/>(gdb) p requestHeaderURI<br/>$1 = 0xa6bc240 &quot;/task&quot;<br/>(gdb) p TASKSURI<br/>No symbol &quot;TASKSURI&quot; in current context.<br/><a href="http://www.jackxiang.com/attachment.php?fid=399" target="_blank"><img src="http://www.jackxiang.com/attachment.php?fid=399" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>————————————————————————————<br/><br/>在编译程序时 加上 -gdwarf-2 -g3 参数 即可。<br/>如 gcc -gdwarf-2 -g3 sed sed.o<br/><br/>————————————————————————————<br/><br/><br/>宏定义#define APLLCON0 *((volatile unsigned int *)0xFF500100)，值为虚拟地址<br/><br/>问题：<br/><br/>gdb跟踪调试想查看该宏的值时，如下提示：No symbol “APLLCON0” in current context.<br/><br/><br/>分析：<br/><br/>参考http://blog.csdn.net/jibing57/article/details/7439631<br/><br/>编译器默认没有把宏定义扩展信息编译进二进制文件。<br/><br/>通过man gcc查看说明，如下<br/><a href="http://www.jackxiang.com/attachment.php?fid=403" target="_blank"><img src="http://www.jackxiang.com/attachment.php?fid=403" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>编译时需添加-gdwarf-2和-g3两个参数。<br/><br/>加了-g3的参数后，gcc编译的时候，会将扩展的debug 信息编译进二进制文件里面，包括宏定义信息。<br/><br/>结论：<br/><br/>在CFLAGS参数后添加-g3 -gdwarf-2参数<br/><a href="http://www.jackxiang.com/attachment.php?fid=401" target="_blank"><img src="http://www.jackxiang.com/attachment.php?fid=401" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>重新编译、gdb调试宏，如下<br/><a href="http://www.jackxiang.com/attachment.php?fid=402" target="_blank"><img src="http://www.jackxiang.com/attachment.php?fid=402" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>来自：http://blog.csdn.net/zhangjs0322/article/details/39666889<br/><br/>开始实践如下：<br/>(gdb) set follow-fork-mode child<br/>(gdb) b 290<br/>Breakpoint 1 at 0x402bd9: file multipepollserver.cpp, line 290.<br/>(gdb) r<br/>..............................<br/>294&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(strncmp(requestHeaderURI,TASKSURI,strlen(requestHeaderURI)) == 0)&#123;//上传分片上报链接<br/>(gdb) n<br/>295&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; printf(&quot;上传分片上报链接&quot;);<br/>(gdb) n<br/>线程捕获到生产出来的产品，consumer thread tid=1086941504 get&nbsp;&nbsp;in bp=-1<br/>298&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(strncmp(requestHeaderURI,SLICEURI,strlen(requestHeaderURI)) == 0)&#123;//上传各分片的链接<br/>(gdb) p requestHeaderURI<br/>$1 = 0xd7df240 &quot;/task&quot;<br/>(gdb) p TASKSURI<br/>上传分片上报链接线程捕获到生产出来的产品，consumer thread tid=1086941504 get&nbsp;&nbsp;in bp=-2<br/>$2 = &quot;/task&quot;<br/><br/>如果去掉生成点o文件里的参数，只保留最后生成的可执行文件是不行的，实践证明，得在生成.o时就加上后，在后面合并时不加也成。（也就是说最后生成的.o里得有，否则，最后一步及时加上也是不行的。）<br/>MakeFile：<br/>multipepollserver:multipepollserver.o memorypool.o<br/>&nbsp;&nbsp;&nbsp;&nbsp;/usr/bin/g++44 -Wall -g -o multipepollserver&nbsp;&nbsp;multipepollserver.o memorypool.o -lrt -lpthread -lmemcached&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>multipepollserver.o:multipepollserver.cpp memorypool.h<br/>&nbsp;&nbsp;&nbsp;&nbsp;/usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g multipepollserver.cpp&nbsp;&nbsp;-std=c++0x<br/>memorypool.o:memorypool.cpp memorypool.h<br/>&nbsp;&nbsp;&nbsp;&nbsp;/usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g memorypool.cpp<br/><br/>clean:<br/>&nbsp;&nbsp;&nbsp;&nbsp;rm -f multipepollserver memorypool.o&nbsp;&nbsp;multipepollserver.o<br/><br/>实践证明，加这一句上，下面生成点O不加也是不行的：<br/>/usr/bin/g++44 -Wall -g -o multipepollserver&nbsp;&nbsp;multipepollserver.o memorypool.o -lrt -lpthread -lmemcached&nbsp;&nbsp;&nbsp;&nbsp;<br/>————————————————————————————————————————————————————————————————————————<br/><br/><br/>其他参考：<br/>来自：http://www.sudu.cn/info/index.php?op=article&amp;id=260892<br/>来自：http://blog.csdn.net/littlefang/article/details/6293448<br/>来自：http://blog.sina.com.cn/s/blog_6cee149d0100ohvl.html
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]gdb调试宏定义并显示宏定义的值,gdb调试时No symbol var defined in current context，局部变量不可查看问题，如何用GDB查看一个宏？ ]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>