有什么办法可以在编译时将.map文件添加为项目的资源吗?

Is it any way to add .map file as resource of the project when compiling?

我想将地图文件添加为资源,然后在每次执行系统时提取文件,以确保地图文件始终正确,并使支持生活更轻松。在 Delphi 7 我可以编译项目,使用地图文件作为资源,但是地图是错误的,因为当引发异常时调用堆栈是错误的。在 Delphi 西雅图,我什至无法编译,因为它会在生成地图之前尝试添加资源。我知道我可以在 post-compile thask 中添加文件,但是有什么办法可以在 compiling/building 时间内完成吗? 抱歉,如果我不是很具体,这是我的第一个问题。谢谢。

更新

看了一些答案后,我做了一些研究。我已经在我的项目中使用 JEDI 异常单元,但我不认识 JEDI 调试专家。它做的正是我想要的,甚至更多。 JEDI Debug 专家将.map 文件转换为.jdbg 文件,这是一个map 的加密文件(map 只是一个文本文件)。此外,jdbg 文件比地图小 12%。它还具有 将 jdbg 插入二进制文件 (exe) 的选项。为此,我启用了选项:

要在 IDE 之外使用此工具,以 Jenkins 为例,我必须构建 JEDI\jcl\examples\windows\debug\tools\MakeJclDbg.dpr 中可用的项目。 build后会在jcl的bin目录下生成exe文件。使用方法:

MakeJclDbg -J -E -M map_filename

J - 创建 .JDBG 文件

E - 将调试数据插入可执行文件

M - 转换后删除 MAP 文件

可执行文件必须与 MAP 文件位于同一目录中。这将创建 jdbg 文件(基于地图文件),插入到 exe 中并删除地图。有了这个(以及 JEDI 的异常单元),当引发异常时,我可以获得堆栈跟踪、系统使用的所有 dll 的版本、操作系统信息等等,并将所有这些发送到电子邮件。

我发现 Embarcadero 也有他们的 bpl 的 jdbg 文件,所以我认为他们也使用 JCL 工具。

你没抓住重点。

MAP 文件作为单独的文件生成,以避免增加可执行文件的大小。试图将该文件作为资源嵌入到可执行文件中只会破坏目的。

您没有提到您使用的是什么调试框架。但是还有其他方法可以提供调试信息,我建议您参考您使用的调试框架的文档了解具体情况。我将只提供一些适用于我尝试过的大多数框架的一般概念。

  • 如果您对增加的 EXE 大小感到满意并希望在您的可执行文件中包含调试信息:不要使用映射文件选项。只需启用链接选项即可 include debug information。 (并确保您的调试框架将使用它。)
  • 大多数调试框架建议在打开 stack frames 的情况下进行编译。这非常重要,因为它使调试框架更容易推导出调用堆栈。
  • 一些调试框架具有允许猜测丢失的调用堆栈信息的功能。如果启用,您将需要手动忽略任何实际上没有意义的堆栈条目。
  • 当然,不要忘记任何没有调试信息编译的单元都不会有调试信息包含在最终的可执行文件中。

不是,映射文件是程序输出链接后生成的。无法将尚未生成的地图文件作为资源合并到项目中。