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

Posted

技术标签:

【中文标题】如何分析使用 Delphi 构建的 exe 的文件大小?【英文标题】:How to analyze the filesize of an exe built with Delphi? 【发布时间】:2016-11-30 09:40:37 【问题描述】:

我想要一份报告,清楚地​​解释为什么使用 Delphi 构建的 exe 具有特定大小。

例如这样的:

filename: Project1.dpr - total size 100MB
   Details:
    - unit1.dcu - 20MB
    - unit2.dcu - 60MB
    - libraries.dcu - 20MB

我想通过这种报告来了解为什么我刚刚构建的 exe 大小为 120MB。它使用来自另一个应用程序的许多文件,这些文件在构建时为 90MB。我只添加了两个单元(并删除了很多),大小从 90 MB 变为 120 MB。我期望尺寸更小(考虑到许多已移除的单元)。

是否有一些工具已经可以做到这一点,或者有没有办法从 IDE 中研究这个问题?

【问题讨论】:

您是否从项目选项中删除了调试信息?它会减少文件大小,它应该在链接部分下 @villekrumlinde 编写了一个分析 exe 文件中单位大小的工具:delphiunitsizes。 您是否在使用泛型?使用泛型可以显着增加 EXE 大小。 删除调试信息。您不需要随产品一起提供。 当然可以。您构建调试信息,但不将其链接到可执行文件。然后,您从构建时捕获的信息中重建详细的堆栈跟踪。 madExcept 就是这样。当然,Eureka 不会强迫您将调试信息发送给客户端。任何 madExcept 都更好! 【参考方案1】:

我想要一份报告,清楚地​​解释为什么使用 Delphi 构建的 exe 具有特定大小。

Ville Krumlinde 编写了一个工具,该工具通过解析链接器创建的映射文件来报告 exe 文件中的单元大小:DelphiUnitSizes。

Project Options|Linking|Map File 设置为PublicsDetailed 并构建完整的exe。使用DelphiUnitSizes 打开生成的地图文件。

另一个类似的工具是 Eric Grange 的 MapFileStats。


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

来自EurekaLog documentation:

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

还有

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

这意味着映射文件以某种方式注入到 exe 文件中,而在 exe 中包含完整的调试信息是可选的。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于如何分析使用 Delphi 构建的 exe 的文件大小?的主要内容,如果未能解决你的问题,请参考以下文章

delphi 请问如何将bpl文件编译到exe文件中!!(紧急求救!!)

新手提问delphi如何生成EXE文件

在Delphi如何将exe文件加入到资源文件中,如何进行调用?

求教在delphi中,如何把两个exe做为res加入到另一个exe中,并在运行时释放两个exe

求教在delphi中,如何把两个exe做为res加入到另一个exe中,并在运行时释放两个exe

求教在delphi中,如何把一个exe做为res加入到dll中,并在运行时生成exe文件执行