[实践OK]gdb调试宏定义并显示宏定义的值,gdb调试时No symbol "var" defined in current context,局部变量不可查看问题,如何用GDB查看一个宏?
背景:调试一个多进程学习的小程序,发出用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
(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
评论列表