如何分析用Delphi构建的exe文件的文件大小?

5
我希望能够得到一份报告,清晰地解释为什么用Delphi构建的exe文件具有特定的大小。
例如,像这样的内容:
filename: Project1.dpr - total size 100MB
   Details:
    - unit1.dcu - 20MB
    - unit2.dcu - 60MB
    - libraries.dcu - 20MB

我希望能够得到这种报告,以了解我刚刚构建的exe文件为什么有120MB大小。它使用了另一个应用程序中的许多文件,构建后大小为90MB。我只添加了两个单元(并删除了许多单元),大小从90MB变为120MB。我原本期望会更小(考虑到已删除的单元)。是否有一些工具已经可以做到这一点,或者是否有一种从IDE研究此问题的方法?

5
你是否已经在项目选项中删除了调试信息?这将减小文件大小,应该在链接部分找到。 - Alberto Miola
2
@villekrumlinde编写了一款工具来分析exe文件中各个单元的大小:delphiunitsizes - LU RD
3
你是否在使用泛型?使用泛型可能会显著增加可执行文件的大小。 - SilverWarior
2
删除调试信息。您不需要将其与产品一起发布。 - David Heffernan
2
当然可以。你可以构建调试信息,但不将其链接到可执行文件中。然后,你可以从在构建时捕获的信息中重建详细的堆栈跟踪。这就是使用 madExcept 的方式。当然,Eureka 并不强制你向客户端提供调试信息。任何情况下使用 madExcept 都更好! - David Heffernan
显示剩余4条评论
2个回答

6
我希望能够得到一份报告,清晰地解释一个由Delphi构建的exe文件为什么具有特定的大小。 Ville Krumlinde编写了一个工具,通过解析链接器创建的映射文件来报告exe文件中单元的大小:DelphiUnitSizes

enter image description here

项目选项|链接|映射文件设置为公共详细,并对exe进行完整构建。使用DelphiUnitSizes打开生成的映射文件。
另一个类似的工具是Eric Grange的MapFileStats

我可以在没有调试信息的情况下使用EurekaLog吗?

根据EurekaLog文档:

"调试信息"(Linker页面,新版Delphi)/“包含TD32调试信息”(旧版Delphi)/“完整的调试信息”(C++ Builder)-此选项将外部调试器的TD32格式的调试信息嵌入您的应用程序中。如果您使用“运行”/“附加到进程”,并且Delphi找不到调试信息,则可能需要此选项。此外,EurekaLog使用TD32信息来完成C ++ Builder中缺失的信息。请注意,启用此选项后,您的Delphi应用程序的大小可能会增加5-10倍(C ++ Builder将信息写入单独的.tds文件),除非您启用“将调试信息放置在单独的TDS文件中”的选项。

还有:

"Map file" - 通过启用此选项,您告诉Delphi的链接器在可执行文件旁创建一个单独的.map文件。地图文件包含可读的调试信息表示。此选项的不同设置控制输出的详细程度。通常,无需将其更改为与“关闭”或“详细”不同的任何内容。地图文件被各种工具用作调试信息的主要来源。例如,EurekaLog自动打开此选项并使用地图文件以其自己的格式创建调试信息,然后将其注入应用程序中。这就是为什么您很少需要手动更改此选项的原因。
这意味着地图文件以某种方式注入到exe文件中,而将完整的调试信息包含在exe中是可选的。

0

如果您不介意阅读一些十六进制代码,您可以在项目选项 - Delphi编译器 - 链接中将映射文件设置为。您将获得一个名为yourexe.map的文本文件,其中包含所包含模块及其各自长度的列表。

这允许对您的exe内容进行基本分析。但是,它无法回答您的下一个问题:“我真的需要所有这些东西吗?”...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接