【问题标题】:What is 'Limited Debug Information'? (Full “Debugging Information" generates huge EXE files)什么是“有限的调试信息”? (完整的“调试信息”会生成巨大的 EXE 文件)
【发布时间】:2015-03-11 22:46:01
【问题描述】:

我最近安装了 Delphi XE7。当我第一次编译一个旧应用程序时,当我看到 EXE 的大小增加了 10MB 时,我惊掉了下巴!

在“项目选项”中播放时,我发现将“调试信息”设置为“有限调试信息”会减小 EXE 大小,使其非常接近 Delphi XE 生成的 EXE。 也许在 Delphi XE7 下,“有限调试信息”相当于 Delphi XE 中的“调试信息”,因为它会产生相同的 EXE 大小?

那么,为什么完整的“调试信息”会使 EXE 如此之大(与 XE 相比)?我无法用有限的信息(我猜)编译 EXE,因为我想完全访问调试的好东西(EurekaLog 也需要它)。
Embarcadero 的文档没有说明“有限”和完整调试信息之间的区别。

EurekaLog 文档适用于旧版本的 Delphi,因此它没有明确说明我是否可以使用新选项(仁慈的)“有限调试信息”或完整的调试信息。我将不得不进行实验。

【问题讨论】:

  • 这里有一个相关的帖子,但它没有处理EXE大小问题:stackoverflow.com/questions/19653475/…
  • 尝试启用链接器的“将调试信息放在单独的 TDS 文件中”选项。
  • @KenWhite-是的。但这一次他们添加了一个新的编译器选项(有限),对此绝对没有一个解释。
  • 为什么需要在 exe 中包含调试信息,或者分发 tds 文件?使用 madExcept,您可以将该信息包含在 exe 中,也可以将其保留在基础文件中。当错误报告发送进来时,错误报告查看器会解码原始数据并将地址转换为函数名、行号等。当然它与 Eureka 相同。
  • @DavidHeffernan-你是对的。对于 EurekaLog,调试信息应该只在“编译”中打开,而不是在“链接”中。

标签: delphi delphi-xe delphi-xe7 eurekalog


【解决方案1】:

“有限调试信息”是一个仅影响 Android 目标编译器的选项。但是,由于所有编译器共享相同的接口,因此每个目标都会出现此选项。它仅适用于每个单独的对象 (.o) 文件中有多少调试信息。对于 Android(和 iOS),调试信息格式为 DWARF。 DWARF 是一种非常冗长的格式,可以包含关于给定单元中所有类型的高度详细的结构类型信息来自给定单元“使用”的所有单元的所有类型的所有类型。在“Limited Debug Information”下,生成所有使用单元的类型信息。这可能意味着调试时可能无法检查某些字段和局部变量。

至于调试信息是否包含在最终的可执行文件中,由链接器选项控制,而不是由编译器选项控制。链接器将链接任何可用的调试信息。如果为 Android 构建并选择“调试信息”,则最终图像将包含更多信息并且更大。

现在我假设你的目标是 Windows(你实际上并没有说你是,但我会在这里使用我的精神力量),在这种情况下,“有限的调试信息”和“调试信息”是一回事。在 Windows 下,调试格式称为“GIANT”。你能说“讽刺”吗? DWARF 是一种极其冗长的格式,而 Embarcadero(Borland 最初的)自己的 GIANT 格式更为紧凑。大小的增加只能来自添加的运行时功能,并且可能来自更多使用泛型。

【讨论】:

  • 感谢您的信息。太糟糕了,没有文档。
  • 谢谢艾伦。您的第一句话已经解释了几乎所有内容:)
  • 作为记录,即使 Android 的链接器会将所有调试信息注入可执行映像(实际上是 Android 上的 .so),但在构建 .apk 文件时会删除该信息,该文件是实际放置在设备(或模拟器)上的内容。对于调试,gdb 调试器不会从打包到 .apk 的映像中读取调试信息,而是从硬盘驱动器上最初链接的映像中读取它。
猜你喜欢
  • 2020-01-15
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多