注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

GDB调试总结之一查看结构体及结构体的指针内容  

2013-12-27 10:55:36|  分类: LINUX编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

GDB调试总结之一查看结构体及结构体的指针内容

在程序中经常会需要打印类或者结构体的内容,有时候儿是普通变量,有的时候儿则是结构体的指针的变量。举一个小例子:

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

struct DataCheck

{

        int t;

        char buf[10];

};

 

int main()

{

        DataCheck dc;

        DataCheck *pdc;

        dc.t = 10;

        memcpy(dc.buf,"is a",5);

        pdc = &dc;

       

return 1;

}

~       

Breakpoint 1, main () at main.cpp:26

26      dc.t = 10;

(gdb) n

27      memcpy(dc.buf,"is a",5);

(gdb)

28      pdc = &dc;

(gdb)

 (gdb) p pdc                                 直接打印指针显示地址

$1 = (DataCheck *) 0xbffff05c

(gdb) p *pdc                                 直接打印地址内容

$2 = {t = 10, buf = "is a\000\000\000\000?"}       

(gdb) p dc                                   直接打印结构体变量

$3 = {t = 10, buf = "is a\000\000\000\000?"}

(gdb) set print pretty on                    设置格式后再打印指针内容

(gdb) p *pdc

$4 = {

  t = 10,

  buf = "is a\000\000\000\000?"

}

(gdb)

看红色的说明,基本就明白了,这个问题是没什么。但是还有一些情况需要说明:

例如在实际的应用程序中经常会有下面的情况:

28      void *pdc = &dc;

(gdb) n

29      BindClass bc;

(gdb) p pdc

$1 = (void *) 0xbffff05c

(gdb) p *pdc

Attempt to dereference a generic pointer.

(gdb) p ((DataCheck*)pdc)->t

$2 = 10

(gdb)

但是下面强制转换后,仍然可以打印出来。

但是,这里的GCC的版本还是比较高的,如果在低版本,或者不同的LINUX的版本上,可能会出现:

no struct type named NewStruct

需在编译时加     -fno-eliminate-unused-debug-types      选项

LINUX下干活基本不要指望着像在WIN下干活那么舒服。不同的版本和不同的库都可能会引起各种不同的错误现象。一定要有心理准备。

古人云:凡事预则立,不预则废。

  评论这张
 
阅读(7884)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017