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

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

gdb中部分静态调试命令  

2014-08-28 17:56:35|  分类: Linux系统编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、静态调试的需求
在一些项目中,由于使用了大量的条件编译,例如glibc、linuxkernel,会导致一个从源代码中很难看出哪些条件被包含入了源代码中;另一方面,在C++中,会有大量的namesapce,模板、派生等关系,导致一个结构的大小或者完整名称不容易确定。在有些情况下,我们希望知道这些结构具体占用了多大空间,这些空间的计算结合源代码看可能不太准确,如果必须运行起来才能查看代价又过大(比如内核替换、glibc替换、各种配置文件及环境搭建等),此时可以使用gdb静态调试一个可执行文件,在非运行态获得结构大小。
二、ptype命令
gdb内置的ptype可以打印出一个结构的类型,在大部分情况下,可以通过该命令显示一个变量或者结构的完整信息。如果不知道某个结构名称的完整类型,只要有一个这种类型的全局变量,静态变量,或者作为一个结构的成员,都可以通过这些信息来间接获得这个结构的类型信息。
在gdb中,可以通过ptype filename::variable来显示araible信息,这对于ariable是一个文件内static变量来说就比较方便。gdb也可以通过ptype functionname::variable来显示函数内静态变量的类型,但是如果ariable是局部变量,在非运行态无法获得该变量的类型信息(至少在我现在测试的gdb6.6版本中不行),猜测是由于局部变量在同一函数中不同的作用域重名的情况比较普遍,所以需要在运行时根据当前IP地址确定在哪个作用域进而确定是哪一个变量。
为了避免和
三、示例
harry@tsecer: ls
a.out  foo.c  main.c
harry@tsecer: rm a.out 
harry@tsecer: ls 
foo.c  main.c
harry@tsecer: gcc -g *.c
harry@tsecer: cat foo.c 
static int bar(int x)
{
static int ibar = 0x2222;
return ibar + x;
}

int foo(int i)
{
        return bar(i);
}
harry@tsecer: cat main.c 
int main(int argc, char * argv[])
{
        static int imain = 0x1111;
        int itest;
        int foo(int);
        return foo(itest);
}
harry@tsecer: gdb a.out 
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-suse-linux"...
Using host libthread_db library "/lib64/libthread_db.so.1".
(gdb) ptype main::imain
type = int
(gdb) ptype main::itest
No registers.
(gdb) ptype foo.c:bar
A syntax error in expression, near `:bar'.
(gdb) ptype foo.c::bar
A syntax error in expression, near `::bar'.
(gdb) ptype 'foo.c'::bar
type = int (int)
(gdb) p sizeof(main)
$1 = 1
(gdb) p sizeof(main::imain)
$2 = 4
(gdb) 
  评论这张
 
阅读(409)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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