对这类任务,如果用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区, 实在是有点冤枉.
这种类型的变量, 潜在的危险性跟全局变量一样, 毕竟, 可以返回它的地址, 也可能在错误地覆盖缓冲区内容时误伤到它. 所以对系统中此类变量的应用应该尽可能小, 在接手一个现有的项目时, 对这种变量有一个全面的把握还是有用的.
阅读(2968) | 评论(0) | 转发(0) |