MAP 文件分析 - 我的代码大小从何而来?

问题描述 投票:0回答:6

我正在寻找一种工具来简化分析大型 C++ 项目 (VC6) 的链接器映射文件。

在维护期间,二进制文件稳定增长,我想弄清楚它来自哪里。我怀疑在不同 DLL 之间共享的库中存在一些过度热心的模板扩展,但只是浏览映射文件并没有给出很好的线索。

有什么建议吗?

c++ linker code-size
6个回答
22
投票

This是一个很棒的编译器生成的地图文件分析/浏览器/查看器工具。检查您是否可以探索 gcc 生成的地图文件。

amap:用于分析 32 位 Visual Studio 编译器生成的 .MAP 文件并报告数据和代码使用的内存量的工具。 此应用程序还可以读取和分析由 Xbox360、Wii 和 PS3 编译器生成的 MAP 文件。


2
投票

地图文件应该有每个部分的大小,您可以编写一个快速工具来按此大小对符号进行排序。 MSVC (undname.exe) 还提供了一个命令行工具,您可以使用它来对符号进行解调。

将符号按大小排序后,您可以根据需要每周或每天生成此符号,并比较每个符号的大小随时间的变化情况。

来自任何单个构建的地图文件可能无法提供太多信息,但已编译地图文件的历史报告可以告诉您很多信息。


2
投票

您是否尝试过在 .obj 文件上使用 dumpbin.exe?

要寻找的东西:

  • 使用大量STL?
  • 很多 C++ 类都有内联方法?
  • 很多常数?

如果上述任何情况适用于您。检查它们是否具有广泛的可见性,即它们是否在您的应用程序的大部分中使用/看到。


1
投票

没有对工具的建议,但猜测可能的原因:您是否启用了增量链接?这可能会导致后续构建期间的扩展...

如果您使用 /opt:ref 进行编译,链接器将删除未使用的符号,因此,如果您使用它而不使用增量链接,我预计二进制文件的扩展只是添加实际新代码的结果。据我所知...希望它能有所帮助。


0
投票

模板、宏、STL 一般都占用大量空间。 BOOST 被誉为一个伟大的通用库,为项目增加了很多空间。 BOOST_FOR_EACH 就是一个例子。它有数百行模板化代码,可以通过编写适当的循环句柄来避免,通常只需再敲几个键即可。

使用 Visual AssistX 来节省打字,而不是使用模板。还要考虑拥有您使用的代码。宏和内联函数扩展不一定会出现。

此外,如果可以的话,放弃 DLL 架构,将所有内容静态链接到一个以不同“模式”运行的可执行文件中。多次使用相同的可执行映像绝对没有问题,只需根据您想要执行的操作传入不同的命令行参数即可。

DLL 是浪费空间和减慢项目运行时间的最大罪魁祸首。人们认为它们可以节省空间,但事实上它们往往会产生相反的效果,有时会使项目大小增加十倍!另外,它们增加了交换。使用固定代码部分(无重定位部分)来提高性能。


0
投票

LinkerScope 是一个用于此特定目的的 Python 程序。它直接从 GNU 的链接器

.map
文件生成 SVG 内存映射图,或者您可以指定多个内存区域并执行自定义内存映射。

免责声明:我是作者。

© www.soinside.com 2019 - 2024. All rights reserved.