编译时是否有任何方法将.map文件添加为项目资源?

5
我想将地图文件作为资源添加到系统中,并在每次执行系统时提取文件,以确保地图文件始终正确,使支持工作更加轻松。在Delphi 7中,我可以将地图文件作为资源编译项目,但是地图是错误的,因为当引发异常时,调用堆栈也是错误的。在Delphi Seattle中,我甚至无法编译,因为它尝试在生成地图之前添加资源。我知道我可以在后编译任务中添加文件,但是否有任何方法在编译/构建时完成呢?
抱歉如果我不够具体,这是我在这里的第一个问题。谢谢。
更新:
在阅读了一些答案后,我进行了一些研究。我已经在我的项目中使用JEDI异常单元,但我不知道JEDI Debug专家。它恰好做我想要的和更多。
JEDI Debug专家会将.map文件转换为.jdbg文件,这是一个map的加密文件(map只是一个文本文件)。此外,jdbg文件大约比map小12%。它还提供了将jdbg插入二进制(exe)的选项。为此,我启用了以下选项:
项目-> JCL Debug专家->生成.jdbg文件->启用此项目
项目-> JCL Debug专家->将jdbg数据插入二进制文件->启用此项目
项目-> JCL Debug专家->转换后删除map文件->启用此项目(如果您想要删除该文件,当然)
要在IDE之外使用此工具,例如在Jenkins中,我必须构建位于JEDI \ jcl \ examples \ windows \ debug \ tools \ MakeJclDbg.dpr中的可用项目。构建后,它将在jcl的bin目录中生成exe文件。如何使用:
MakeJclDbg -J -E -M map_filename J-创建.JDBG文件
E-将调试数据插入可执行文件中
M-转换后删除MAP文件
可执行文件必须与MAP文件位于同一目录中。这将创建基于地图文件的jdbg文件,并将其插入exe中并删除地图。有了这个(和JEDI的异常单元),当引发异常时,我可以获得堆栈跟踪,系统中使用的所有dll版本,操作系统信息等,并将所有这些内容发送到电子邮件中。
我意识到Embarcadero也拥有他们自己的bpl的jdbg文件,因此我认为他们也使用JCL工具。

2
@Jerry:什么代码?问题是关于将资源添加到可执行文件中。没有涉及任何代码。这是链接器在构建可执行文件时生成的映射文件。 - Ken White
2
@Jerry:不是的。你也可以使用brcc或MS rcc从命令行或后构建事件中添加它。但即使你要求IDE执行此操作,它仍然不是代码;它是编译器指令,一个简单的{$R filename.ext} - Ken White
3
JEDI具有将地图文件嵌入可执行文件并提供调试单元的能力,您可以直接在应用程序中使用它,而无需将其提取到磁盘。其他调试工具(如MadExcept和Eureka)也具有相同的功能。使用它们中的一个要比尝试自己编写更容易。 - Ken White
2
@Jerry:编译器指令添加资源的位置无关紧要。资源是通过链接过程添加的,这个过程发生在编译器完成工作之后。 (实际上,资源是在链接器完成后添加的,因为它们被添加到最终的可执行文件中;这就是为什么您可以使用brcc手动将它们添加到现有的exe中。) - Ken White
1
@MartynA 没错,这就是我的观点。在 Ken 加入之后,我删除了关于编译器指令 {$R ... } 的原始评论,你可能没有看到。无论如何 - 我想说的是,我们不知道 OP 正在做什么,应该更加努力地描述问题以及已经尝试过的内容 - 而不是尚未尝试的内容。 - Jerry Dodge
显示剩余5条评论
2个回答

2
不,地图文件是在程序输出被链接后生成的。无法将尚未生成的地图文件作为资源并入项目中。

1
你没有抓住重点。
MAP文件是作为一个单独的文件生成的,以避免增加可执行文件的大小。试图将该文件作为资源嵌入回可执行文件中只会起到相反的作用。
你没有提到你使用的调试框架。但是还有其他提供调试信息的方法,我建议你参考你所使用的调试框架的文档来了解具体细节。我只提供一些适用于我尝试过的大多数框架的概念。
  • 如果您愿意增加EXE文件的大小,并希望在可执行文件中包含调试信息:不要使用映射文件选项。只需启用链接选项以包括调试信息即可。(并确保您的调试框架将使用它。)
  • 大多数调试框架建议打开堆栈帧编译。这非常重要,因为它使得调试框架更容易推断调用堆栈。
  • 一些调试框架具有一个功能,可以猜测缺失的调用堆栈信息。如果启用了此功能,则需要手动忽略任何实际上没有意义的堆栈条目。
  • 当然,不要忘记,任何没有调试信息编译的单元都不会在最终的可执行文件中包含调试信息。

我正在使用JEDI工具作为调试框架。我之前不知道有调试信息。我在这里进行了测试,但EXE文件的大小增加太多了,远超简单地将映射文件大小添加到EXE中。我想我会继续使用映射文件。 - Rodrigo Caetano

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