快速查找所有静态对象的方法

时间:2014-06-16 01:23:29

标签: c++

我希望在大型代码库中确定静态存储持续时间的所有对象的位置;这样我就可以查看静态初始化顺序是否存在任何潜在问题。

有没有好办法呢?

仅仅搜索关键字static还不够好,因为它会遗漏在命名空间范围内声明的任何对象。

链接器的地图文件确实指出了bssdata区域有多大,但是它的所有名称都被删除了非extern的符号。

目前我正在筛选每个目标文件的转储,寻找DATA和BSS,但这很痛苦,并且有很多垃圾,例如类vtable和编译器生成的静态数据。

1 个答案:

答案 0 :(得分:1)

免责声明:这是一个相当本地化和不完整的答案。我把它留在这里,希望有人可以从中受益(也许建立在它上面)。

使用gcc工具链,在启动时__main调用__do_global_ctors,执行向后遍历__CTOR_LIST__。例如,在nm库上使用.so,我得到:

00000000004e2040 d __CTOR_END__
00000000004e2000 d __CTOR_LIST__
00000000004e2050 d __DTOR_END__
00000000004e2048 d __DTOR_LIST__

从那时起,我想你可以从那些地址到正在执行的有效功能;但是,正如您所注意到的,映射回源名称可能很尴尬(特别是在匿名名称空间中)。您可以从调试信息中恢复它们(源位置),但到目前为止我还没有进展。