Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315174
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2010-05-13 14:03:21

对这类任务,如果用grep来搜索 static, 可能会误报一大片, 只对单个源文件可见的静态变量和定义在函数内部的局部静态变量都可能有 static关键字, 函数定义中也可能出现static 关键字.

void foo()
{
  static int i_a = 3;
  ...
}

施以以下命令
gcc -g -o test test.c
gdb ./test

info variables
注意此时程序还没有运行, 对全局或局部静态变量的符号解析无需有一个运行时上下文即可进行.
可以看到如下内容
(gdb) info variables
All defined variables:

File test.c:
_Bool xb;

Non-debugging symbols:
0x08048734  _fp_hw
0x08048738  _IO_stdin_used
0x0804873c  __dso_handle
0x08048740  __PRETTY_FUNCTION__.1866
0x080487b2  __PRETTY_FUNCTION__.1905
0x080487f4  __FRAME_END__
0x080497f8  __CTOR_LIST__
0x080497f8  __fini_array_end
0x080497f8  __fini_array_start
0x080497f8  __init_array_end
0x080497f8  __init_array_start
0x080497f8  __preinit_array_end
0x080497f8  __preinit_array_start
0x080497fc  __CTOR_END__
0x08049800  __DTOR_LIST__
0x08049804  __DTOR_END__
0x08049808  __JCR_END__
0x08049808  __JCR_LIST__
0x0804980c  _DYNAMIC
0x080498d8  _GLOBAL_OFFSET_TABLE_
0x08049900  __data_start
0x08049900  data_start
0x08049908  dtor_idx.5793
0x0804990c  completed.5791
0x08049910  i_a.1902

注意 最后一行红色的, 是程序中定义的变量, 因为是静态变量, 所以程序在载入时就已经在相应内存位置把对应的值加载进去了. 无需通过CPU指令来赋值,
x/1dw 0x8049910
查看其内容, 会看到初始值为3.

这证实这种格式的变量正是程序中定义的局部静态变量, 被放在了 Non-Debugging symbol区, 实在是有点冤枉.

这种类型的变量, 潜在的危险性跟全局变量一样, 毕竟, 可以返回它的地址, 也可能在错误地覆盖缓冲区内容时误伤到它. 所以对系统中此类变量的应用应该尽可能小, 在接手一个现有的项目时, 对这种变量有一个全面的把握还是有用的.
阅读(2904) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~