[实践OK]gdb调试宏定义并显示宏定义的值,gdb调试时No symbol "var" defined in current context,局部变量不可查看问题,如何用GDB查看一个宏?

jackxiang 2015-3-18 16:08 | |
背景:调试一个多进程学习的小程序,发出用gdb调试,出现:gdb调试时No symbol "var" defined in current context,if(strncmp(requestHeaderURI,TASKSURI,strlen(requestHeaderURI)) == 0){//上传分片上报链接 发现在点问题,于是查了下网络,同时发现宏好像不适合用这个函数作比较:char *strncpy(char *dest, const char *src, size_t n);。
(gdb) p requestHeaderURI
$1 = 0xa6bc240 "/task"
(gdb) p TASKSURI
No symbol "TASKSURI" in current context.
点击在新窗口中浏览此图片
————————————————————————————

在编译程序时 加上 -gdwarf-2 -g3 参数 即可。
如 gcc -gdwarf-2 -g3 sed sed.o

————————————————————————————


宏定义#define APLLCON0 *((volatile unsigned int *)0xFF500100),值为虚拟地址

问题:

gdb跟踪调试想查看该宏的值时,如下提示:No symbol “APLLCON0” in current context.


分析:

参考http://blog.csdn.net/jibing57/article/details/7439631

编译器默认没有把宏定义扩展信息编译进二进制文件。

通过man gcc查看说明,如下
点击在新窗口中浏览此图片

编译时需添加-gdwarf-2和-g3两个参数。

加了-g3的参数后,gcc编译的时候,会将扩展的debug 信息编译进二进制文件里面,包括宏定义信息。

结论:

在CFLAGS参数后添加-g3 -gdwarf-2参数
点击在新窗口中浏览此图片

重新编译、gdb调试宏,如下
点击在新窗口中浏览此图片
来自:http://blog.csdn.net/zhangjs0322/article/details/39666889

开始实践如下:
(gdb) set follow-fork-mode child
(gdb) b 290
Breakpoint 1 at 0x402bd9: file multipepollserver.cpp, line 290.
(gdb) r
..............................
294                         if(strncmp(requestHeaderURI,TASKSURI,strlen(requestHeaderURI)) == 0){//上传分片上报链接
(gdb) n
295                             printf("上传分片上报链接");
(gdb) n
线程捕获到生产出来的产品,consumer thread tid=1086941504 get  in bp=-1
298                         if(strncmp(requestHeaderURI,SLICEURI,strlen(requestHeaderURI)) == 0){//上传各分片的链接
(gdb) p requestHeaderURI
$1 = 0xd7df240 "/task"
(gdb) p TASKSURI
上传分片上报链接线程捕获到生产出来的产品,consumer thread tid=1086941504 get  in bp=-2
$2 = "/task"

如果去掉生成点o文件里的参数,只保留最后生成的可执行文件是不行的,实践证明,得在生成.o时就加上后,在后面合并时不加也成。(也就是说最后生成的.o里得有,否则,最后一步及时加上也是不行的。)
MakeFile:
multipepollserver:multipepollserver.o memorypool.o
    /usr/bin/g++44 -Wall -g -o multipepollserver  multipepollserver.o memorypool.o -lrt -lpthread -lmemcached                                                                                        
multipepollserver.o:multipepollserver.cpp memorypool.h
    /usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g multipepollserver.cpp  -std=c++0x
memorypool.o:memorypool.cpp memorypool.h
    /usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g memorypool.cpp

clean:
    rm -f multipepollserver memorypool.o  multipepollserver.o

实践证明,加这一句上,下面生成点O不加也是不行的:
/usr/bin/g++44 -Wall -g -o multipepollserver  multipepollserver.o memorypool.o -lrt -lpthread -lmemcached    
————————————————————————————————————————————————————————————————————————


其他参考:
来自:http://www.sudu.cn/info/index.php?op=article&id=260892
来自:http://blog.csdn.net/littlefang/article/details/6293448
来自:http://blog.sina.com.cn/s/blog_6cee149d0100ohvl.html

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/7874/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2015-3-18 17:19
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]